拓扑排序的英文名是 Topological sorting。 拓扑排序要解决的问题是给一个有向无环图的所有节点排序。 我们可以拿大学每学期排课的例子来描述这个过程,比如学习大学课程中有:「程序设计」,「算法语言」,「高等数学」,「离散数学」,「编译技术」,「普通物理」,「数据结构」,「数据库系统」等。按照例子中的排课,当我们想要学习「数据结构」的时候,就必须先学会「离散数学」,学习完这门课后就获得了学习「编译技术」的前置条件。当然,「编译技术」还有一个更加前的课程「算法语言」。这些课程就相当于几个顶点 但是如果某一天排课的老师打瞌睡了,说想要学习 数据结构,还得先学 操作系统,而 操作系统 的前置课程又是 数据结构,那么到底应该先学哪一个(不考虑同时学习的情况)?在这里,数据结构 和 操作系统 间就出现了一个环,显然同学们现在没办法弄清楚自己需要先学什么了,也就没办法进行拓扑排序了。因为如果有向图中存在环路,那么我们就没办法进行拓扑排序。 因此我们可以说 在一个 DAG(有向无环图) 中,我们将图中的顶点以线性方式进行排序,使得对于任何的顶点 还有给定一个 DAG,如果从 拓扑排序的目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点。 日常生活中,一项大的工程可以看作是由若干个子工程组成的集合,这些子工程之间必定存在一定的先后顺序,即某些子工程必须在其他的一些子工程完成后才能开始。 我们用有向图来表现子工程之间的先后关系,子工程之间的先后关系为有向边,这种有向图称为顶点活动网络,即 AOV 网 (Activity On Vertex Network)。一个 AOV 网必定是一个有向无环图,即不带有回路。与 DAG 不同的是,AOV 的活动都表示在边上。(上面的例图即为一个 AOV 网) 在 AOV 网中,顶点表示活动,弧表示活动间的优先关系。AOV 网中不应该出现环,这样就能够找到一个顶点序列,使得每个顶点代表的活动的前驱活动都排在该顶点的前面,这样的序列称为拓扑序列(一个 AOV 网的拓扑序列不是唯一的),由 AOV 网构造拓扑序列的过程称为拓扑排序。因此,拓扑排序也可以解释为将 AOV 网中所有活动排成一个序列,使得每个活动的前驱活动都排在该活动的前面(一个 AOV 网中的拓扑排序也不是唯一的)。 前驱活动:有向边起点的活动称为终点的前驱活动(只有当一个活动的前驱全部都完成后,这个活动才能进行)。 后继活动:有向边终点的活动称为起点的后继活动。 检测 AOV 网中是否带环的方式是构造拓扑序列,看是否包含所有顶点。 重复上面两步,直到所有顶点都输出,拓扑排序完成,或者图中不存在入度为零的点,此时说明图是有环图,拓扑排序无法完成,陷入死锁。 与 AOV 网对应的是 AOE 网(Activity On Edge Network) 即边表示活动的网。AOE 网是一个带权的有向无环图,其中,顶点表示事件,弧表示活动持续的时间。通常,AOE 网可以用来估算工程的完成时间。AOE 网应该是无环的,且存在唯一入度为零的起始顶点(源点),以及唯一出度为零的完成顶点(汇点)。 AOE 网中的有些活动是可以并行进行的,所以完成整个工程的最短时间是从开始点到完成点的最长活动路径长度(这里所说的路径长度是指路径上各活动的持续时间之和,即弧的权值之和,不是路径上弧的数目)。因为一项工程需要完成所有工程内的活动,所以最长的活动路径也是关键路径,它决定工程完成的总时间。 活动:AOE 网中,弧表示活动。弧的权值表示活动持续的时间,活动在事件被触发后开始。 事件:AOE 网中,顶点表示事件,事件能被触发。 弧(活动) 弧(活动) 顶点(事件) 顶点(事件) 关键路径:AOE 网中从源点到汇点的最长路径的长度。 关键活动:关键路径上的活动,最早开始时间和最迟开始时间相等。 按拓扑顺序求,最早是从前往后,前驱顶点的最早开始时间与边的权重之和最大者,最迟是从后往前,后继顶点的最迟开始时间与边的权重之差的最小者。 输入 从源点 从汇点 根据各顶点的 初始状态下,集合 每次从 不断重复以上过程,直到集合 首先看来自 Wikipedia 的伪代码 代码的核心是维持一个入度为 0 的顶点的集合。 可以参考该图 对其排序的结果就是:2 -> 8 -> 0 -> 3 -> 7 -> 1 -> 5 -> 6 -> 9 -> 4 -> 11 -> 10 -> 12 假设这个图 因而总的时间复杂度就有 时间复杂度: 考虑一个图,删掉某个入度为 拓扑排序可以判断图中是否有环,还可以用来判断图是否是一条链。拓扑排序可以用来求 AOE 网中的关键路径,估算工程完成的最短时间。 将 Kahn 算法中的队列替换成最大堆/最小堆实现的优先队列即可,此时总的时间复杂度为 CF 1385E:需要通过拓扑排序构造。 Luogu P1347: 拓扑排序模板。实现
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
本页面最近更新:2023/11/19 21:40:31,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:aofall, CCXXXI, ChungZH, CoelacanthusHex, countercurrent-time, cquptEthan, Enter-tainer, evrmji, fearlessxjdx, H-J-Granger, Haohu Shen, HeRaNO, iamtwz, Ir1d, kfy666, Marcythm, mcendu, Menci, NachtgeistW, ouuan, Persdre, Petalzu, Prevalence, shawlleyw, ShizuhaAki, shuzhouliu, SukkaW, Tiphereth-A, TrisolarisHD, Walker30360, william-song-shy, Xeonacid, zhb2000
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用
创客课程开发的每个主题课程需要基于现实情景,设置学习探究任务,通过问题研究、任务...
创客空间建设 能够给人们分享各种乐趣,通过电脑,技术,科学,艺术结合,设计创造一...
在了解创客教育之前,我们首先了解下何为创客。创客是一群喜欢或享受创新的人。创客跨...
STEAM教育是对传统教育的提升,它是基于自然学校方式的功能性框架,可以适合各类...