第16讲拓扑排序和关键路径
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Essential of Lecture Sixteen :
一、拓扑排序
二、关键路径
1
一、有向无环图及其应用
有向无环图:没有回路的有向图
(a)有向树
(b)有向无环图
(c)有向图
2
问题:判断一个有向图是否为有向无环图的方法是?
一、有向无环图及其应用
应用: 工程流程、生产过程中各道工序的流程、
程序流程、课程的流程。 对整个工程和系统,人们关心的问题是: (1)工程能否顺利进行, ,即工程流程是否“合理”; (2)完成整项工程至少需要多少时间,哪些子工程是影响 工程进度的关键子工程。
8
一、有向无环图及其应用
拓扑排序(TopologicalSort)
按照有向图给出的次序关系,将图中 顶点排成一个线性序列,对于有向图中没 有限定次序关系的顶点,则可以人为加上 任意的次序关系
由此所得顶点的线性序列称之为拓扑 有序序列
9
例如:对于下列有向图
B A
C
D
可求得拓扑有序序列: ABCD 或 ACBD
17
拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11--C6--C12
C4 C2 C1 C12 C3
C5
C7 如何在计算机上实现 对有向图的拓扑排序? C8
C9
C10
C11
C6
拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12--C8 或 :C9--C10--C11--C6--C1--C12--C4--C2--C3--C5--C7--C8
C6
拓扑序列:C1--C2--C3--C4--C5 ( 5)
C8 C12 C8
C10 C6 C11 C6
拓扑序列:C1--C2--C3--C4--C5--C7--C9 C11 --C10 ( 8) 拓扑序列:C1--C2--C3--C4--C5--C7--C9 16 ( 7)
C12 C8 C6
( 9)
2
F A
F ∧
27
AOV网应用:拓扑排序
拓扑排序
A
in vertex firstarc
0 0 1 0 2 0 3 0
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
F
4 0 5 0
2
F A
F ∧
28
AOV网应用:拓扑排序
拓扑排序算法——伪代码
1. 栈或队列S初始化;累加器count初始化; 2. 扫描顶点表,将没有前驱的顶点压栈或入队; 3. 当栈或队列S非空时循环 3.1 退出vj栈顶或队首元素;输出vj;累加器加1 3.2 将顶点vj的各个邻接点的入度减1; 3.3 将新的入度为0的顶点入栈或入队; 4. if (count<vertexNum) 输出有回路信息; 作业: 请编程求AOV网的拓扑排序。
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
2
E B
F ∧
23
AOV网应用:拓扑排序
拓扑排序
A C E B D F
in vertex firstarc
0 3 1 0 1 2 0 3 3 2 4 0 5 1 2
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
0 3 1 0 2 1 3 3 4 0 5 2
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
2
F ∧
(b) AOV网的邻接表存储
22
(a) 一个AOV网
AOV网应用:拓扑排序
拓扑排序
A C E B D F
in vertex firstarc
0 3 1 0 2 1 3 3 4 0 5 2
工程流程可用如下AOV网表示:
5
B
6 4
D
6
(开始) A
7
4
C
F (结束)
5 3 E 1
5
一、有向无环图及其应用
例
例 2: 计算机专业学生的学习就是一个工程,每一 门课程的学习就是整个工程的一些活动。其中有些课程要 求先修课程,有些则不要求。这样在有的课程之间有领先 关系,有的课程可以并行地学习。
35
一、有向无环图及其应用
Vi
ak
Vj
事件Vj 的最早发生时间Ve[j],是从源点到顶点Vj的最大路径长度。 事件Vj 的最迟发生时间Vl[j], 指在不推迟整个工期的前提下,事件最
晚必须发生的时间。
活动ak的最早开始时间e[k],该活动的尾事件的最早发生时间。 活动ak的最晚开始时间l[k],它的弧头顶点事件允许的最晚发生时间
Vj
a8=1
V6
a2=2
事件Vi发生表示 ak可以开始
Vi
ak
事件Vj发生表示 ak已结束
AOE网
34
一、有向无环图及其应用
AOE网可以回答下列问题: 1. 完成整个工程至少需要多少时间? 2. 为缩短完成工程所需的时间, 应当加快哪些活动?
从始点到终点的路径可能不止一条,只有各条路径上所有活 动都完成了,整个工程才算完成。因此,完成整个工程所需 的最短时间取决于从始点到终点的最长路径长度,即这条路 径上所有活动的持续时间之和。这条路径长度最长的路径就 叫做关键路径。
10
反之,对于下列有向图
B
A C D
不能求得它的拓扑有序序列。
因为图中存在一个回路 {B, C, D}
11
一、有向无环图及其应用
拓扑排序方法:
第一步: 在有向图选一无前趋的顶点v,输出; 第二步: 从有向图中删除v及以v为尾的孤; 重复第一步和第二步,直到输出全部顶点或有向 图中不存在无前趋顶点(此时图中存在环)。
一个AOV网的拓扑序列不是唯一的
18
c
a
g
d
e
b
h
f
a
b h c d g f
e
19
一、有向无环图及其应用
拓扑排序算法
(1) 选择一入度为 0 顶点 v,输出; (2) 将 v 邻接到的顶点的入度减1; (3) 重复12,直到输出全部顶点或图中没有入度为0的顶点;
拓扑排序涉及的数据和操作: 数据:有向图,顶点的入度; 操作:(1) 选择一入度为 0 顶点v,输出; (2) 将 v 邻接到的顶点 u 的入度减1;
C12 C8
(10)
拓扑序列:C1--C2--C3--C4--C5--C7--C9 拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11--C6 --C10--C11
C8
(11)
拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11--C6--C12--C8 (12)
}
while (!q.Empty()) { // 队列非空 int v1; q.OutQueue(v1); // 取出一个入度为0的顶点 cout << v1 << " "; count++; // 对输出顶点进行记数 for (int v2 = g.FirstAdjVex(v1); v2 != -1; v2 = g.NextAdjVex(v1, v2)) { // v2为v1的一个邻接点 if (--indegree[v2] == 0)//邻接点入度减1 q.InQueue(v2);//入度为0,v2入队 }; } } delete []indegree; // 释放indegree所占用的存储空间 if (count < g.GetVexNum()) return FAIL; // g有回路 else return SUCCESS; // 拓扑排序成功
2
C E B
F ∧
24
AOV网应用:拓扑排序
拓扑排序
A C B D F
in vertex firstarc
0 3 2 1 0 2 0 3 2 1 4 0 5 1
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
2
C
B
F ∧
25
AOV网应用:拓扑排序
拓扑排序
A B D F
in vertex firstarc
c3
c7
c3,c4 c11 c5,c3 c9 c3,c6 无 c9 c9 c9,c10,c1
c12 c10 c11
7
c6
c8
一、有向无环图及其应用
一个可行的施工计划为:A,B,C, D,E,F
一个可行的学习计划为: C1,C9,C4,C2,C10,C11,C12,C3,C6,C5,C7,C8
可行的计划的特点:若在流程图中顶点v是顶点u 的前 趋,则在计划序列中顶点v 也是u的前趋。
⑵ 只有在进入某顶点的各活动都结束,该顶点所代表的 事件才能发生。
32
整个工程完成的时间为:从有向图的始 点到终点的最长路径
例如:
a
6
4 5
b
1
1 e
8
7
g 4
h
2
k
终点
始点
c 2 4
d
f
33
一、有向无环图及其应用
顶点表示事件
a4=3
a1=3
边表示活动
V2
V5
V4
a3=2 a5=4
V3
V1
a7=2 a6=3
减去该活动持续的时间。
活动ak 的时间余量diff[k] =l[k]-e[k]时间余量为0者即为关键活动
36
AOE网应用:关键路径
⑴ 事件的最早发生时间ve[k] ve[k]是指从始点开始到顶点vk的最大路径长度。这 个长度决定了所有从顶点vk发出的活动能够开工的 最早时间。
12
C4 C2 C1 C3
C5
C7 C8
C12
C10
C9
C6
C11
拓扑序列:开始 ( 0)
13
C4 C2 C3 C12
C5
C4
C5
C7 C12 C8
C3
C7 C8
C9
C10 C11 拓扑序列:C1 ( 1)
C6
C9
C10
C11
C6
拓扑序列:C1--C2
( 2)
14
C4
C5
C5
C7 C12 C12
29
template <class ElemType> StatusCode TopSort(const AdjMatrixDirGraph<ElemType> &g) // 初始条件:存在有向图g // 操作结果:如g无回路,则输出g的顶点的一个拓扑序列, // 并返回SUCCESS,否则返回FAIL { int *indegree = new int[g.GetVexNum()]; //入度数组 LinkQueue<int> q; // 队列 int count = 0; StatIndegree(g, indegree); // 统计顶点的入度 for (int v = 0; v < g.GetVexNum(); v++) { // 遍历顶点 if (indegree[v] == 0) q.InQueue(v);// 建立入度为0的顶点队列 } 30
6
例 2: 课程流程图
课程编号 课程名称 先决条件 如何安排施工计划? c4 无 如何安排教学计划? c1 c2 c1,c2 c1 c1
Leabharlann Baidu
c5
c1 c2 c3 c4 c5 c6 c7
C8
c9 c10 c11 c12
程序设计 离散数学 数据结构 汇编语言 算法分析 计算机体系 编译方法 操作系统 高等数学 线性代数 电子电路 数值分析
31
一、有向无环图及其应用
2、关键路径
AOE网:在一个表示工程的带权有向图中,用顶点表示事 件,用有向边表示活动,边上的权值表示活动的持续时间 ,称这样的有向图叫做边表示活动的网,简称AOE网。 AOE网中没有入边的顶点称为始点(或源点),没有出边 的顶点称为终点(或汇点)。 AOE网的性质: ⑴ 只有在某顶点所代表的事件发生后,从该顶点出发的 各活动才能开始;
20
AOV网应用:拓扑排序
设计数据结构
1. 图的存储结构:采用邻接表存储 ,在顶点 表中增加一个入度域。
in vertex firstedge
顶点表结点
2. 栈S:存储所有无前驱的顶点。 思考:可以用队列吗?
21
AOV网应用:拓扑排序
拓扑排序
A C E B D F
in vertex firstarc
C7
C8 C9 C10 C6
C8
C9 C10 C11 C6
C11
拓扑序列:C1--C2--C3--C4 ( 4)
拓扑序列:C1--C2--C3 ( 3)
15
C7
C12 C8 C9 C10 C11 拓扑序列:C1--C2--C3--C4--C5--C7 ( 6) C12 C6
C12
C8 C9
C10
C11
0 2 1 1 0 2 0 1 3 0 4 0 5 1
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
2
F ∧
D B
26
AOV网应用:拓扑排序
拓扑排序
A D F
in vertex firstarc
0 1 0 1 0 2 0 3 0 4 0 5 1 0
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
(1)拓扑排序
(2)关键路径
3
一、有向无环图及其应用
1、拓扑排序
为求解工程流程是否“合理”,通常用AOV网的 有向图表示工程流程。
AOV网( activity on vertex network )
用顶点表示活动,边表示活动的顺序关系。
4
一、有向无环图及其应用
例
某工程可分为6个子工程,若用顶点表示子工程(也称 活动), 用弧表示子工程间的顺序关系。
一、拓扑排序
二、关键路径
1
一、有向无环图及其应用
有向无环图:没有回路的有向图
(a)有向树
(b)有向无环图
(c)有向图
2
问题:判断一个有向图是否为有向无环图的方法是?
一、有向无环图及其应用
应用: 工程流程、生产过程中各道工序的流程、
程序流程、课程的流程。 对整个工程和系统,人们关心的问题是: (1)工程能否顺利进行, ,即工程流程是否“合理”; (2)完成整项工程至少需要多少时间,哪些子工程是影响 工程进度的关键子工程。
8
一、有向无环图及其应用
拓扑排序(TopologicalSort)
按照有向图给出的次序关系,将图中 顶点排成一个线性序列,对于有向图中没 有限定次序关系的顶点,则可以人为加上 任意的次序关系
由此所得顶点的线性序列称之为拓扑 有序序列
9
例如:对于下列有向图
B A
C
D
可求得拓扑有序序列: ABCD 或 ACBD
17
拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11--C6--C12
C4 C2 C1 C12 C3
C5
C7 如何在计算机上实现 对有向图的拓扑排序? C8
C9
C10
C11
C6
拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12--C8 或 :C9--C10--C11--C6--C1--C12--C4--C2--C3--C5--C7--C8
C6
拓扑序列:C1--C2--C3--C4--C5 ( 5)
C8 C12 C8
C10 C6 C11 C6
拓扑序列:C1--C2--C3--C4--C5--C7--C9 C11 --C10 ( 8) 拓扑序列:C1--C2--C3--C4--C5--C7--C9 16 ( 7)
C12 C8 C6
( 9)
2
F A
F ∧
27
AOV网应用:拓扑排序
拓扑排序
A
in vertex firstarc
0 0 1 0 2 0 3 0
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
F
4 0 5 0
2
F A
F ∧
28
AOV网应用:拓扑排序
拓扑排序算法——伪代码
1. 栈或队列S初始化;累加器count初始化; 2. 扫描顶点表,将没有前驱的顶点压栈或入队; 3. 当栈或队列S非空时循环 3.1 退出vj栈顶或队首元素;输出vj;累加器加1 3.2 将顶点vj的各个邻接点的入度减1; 3.3 将新的入度为0的顶点入栈或入队; 4. if (count<vertexNum) 输出有回路信息; 作业: 请编程求AOV网的拓扑排序。
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
2
E B
F ∧
23
AOV网应用:拓扑排序
拓扑排序
A C E B D F
in vertex firstarc
0 3 1 0 1 2 0 3 3 2 4 0 5 1 2
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
0 3 1 0 2 1 3 3 4 0 5 2
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
2
F ∧
(b) AOV网的邻接表存储
22
(a) 一个AOV网
AOV网应用:拓扑排序
拓扑排序
A C E B D F
in vertex firstarc
0 3 1 0 2 1 3 3 4 0 5 2
工程流程可用如下AOV网表示:
5
B
6 4
D
6
(开始) A
7
4
C
F (结束)
5 3 E 1
5
一、有向无环图及其应用
例
例 2: 计算机专业学生的学习就是一个工程,每一 门课程的学习就是整个工程的一些活动。其中有些课程要 求先修课程,有些则不要求。这样在有的课程之间有领先 关系,有的课程可以并行地学习。
35
一、有向无环图及其应用
Vi
ak
Vj
事件Vj 的最早发生时间Ve[j],是从源点到顶点Vj的最大路径长度。 事件Vj 的最迟发生时间Vl[j], 指在不推迟整个工期的前提下,事件最
晚必须发生的时间。
活动ak的最早开始时间e[k],该活动的尾事件的最早发生时间。 活动ak的最晚开始时间l[k],它的弧头顶点事件允许的最晚发生时间
Vj
a8=1
V6
a2=2
事件Vi发生表示 ak可以开始
Vi
ak
事件Vj发生表示 ak已结束
AOE网
34
一、有向无环图及其应用
AOE网可以回答下列问题: 1. 完成整个工程至少需要多少时间? 2. 为缩短完成工程所需的时间, 应当加快哪些活动?
从始点到终点的路径可能不止一条,只有各条路径上所有活 动都完成了,整个工程才算完成。因此,完成整个工程所需 的最短时间取决于从始点到终点的最长路径长度,即这条路 径上所有活动的持续时间之和。这条路径长度最长的路径就 叫做关键路径。
10
反之,对于下列有向图
B
A C D
不能求得它的拓扑有序序列。
因为图中存在一个回路 {B, C, D}
11
一、有向无环图及其应用
拓扑排序方法:
第一步: 在有向图选一无前趋的顶点v,输出; 第二步: 从有向图中删除v及以v为尾的孤; 重复第一步和第二步,直到输出全部顶点或有向 图中不存在无前趋顶点(此时图中存在环)。
一个AOV网的拓扑序列不是唯一的
18
c
a
g
d
e
b
h
f
a
b h c d g f
e
19
一、有向无环图及其应用
拓扑排序算法
(1) 选择一入度为 0 顶点 v,输出; (2) 将 v 邻接到的顶点的入度减1; (3) 重复12,直到输出全部顶点或图中没有入度为0的顶点;
拓扑排序涉及的数据和操作: 数据:有向图,顶点的入度; 操作:(1) 选择一入度为 0 顶点v,输出; (2) 将 v 邻接到的顶点 u 的入度减1;
C12 C8
(10)
拓扑序列:C1--C2--C3--C4--C5--C7--C9 拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11--C6 --C10--C11
C8
(11)
拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11--C6--C12--C8 (12)
}
while (!q.Empty()) { // 队列非空 int v1; q.OutQueue(v1); // 取出一个入度为0的顶点 cout << v1 << " "; count++; // 对输出顶点进行记数 for (int v2 = g.FirstAdjVex(v1); v2 != -1; v2 = g.NextAdjVex(v1, v2)) { // v2为v1的一个邻接点 if (--indegree[v2] == 0)//邻接点入度减1 q.InQueue(v2);//入度为0,v2入队 }; } } delete []indegree; // 释放indegree所占用的存储空间 if (count < g.GetVexNum()) return FAIL; // g有回路 else return SUCCESS; // 拓扑排序成功
2
C E B
F ∧
24
AOV网应用:拓扑排序
拓扑排序
A C B D F
in vertex firstarc
0 3 2 1 0 2 0 3 2 1 4 0 5 1
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
2
C
B
F ∧
25
AOV网应用:拓扑排序
拓扑排序
A B D F
in vertex firstarc
c3
c7
c3,c4 c11 c5,c3 c9 c3,c6 无 c9 c9 c9,c10,c1
c12 c10 c11
7
c6
c8
一、有向无环图及其应用
一个可行的施工计划为:A,B,C, D,E,F
一个可行的学习计划为: C1,C9,C4,C2,C10,C11,C12,C3,C6,C5,C7,C8
可行的计划的特点:若在流程图中顶点v是顶点u 的前 趋,则在计划序列中顶点v 也是u的前趋。
⑵ 只有在进入某顶点的各活动都结束,该顶点所代表的 事件才能发生。
32
整个工程完成的时间为:从有向图的始 点到终点的最长路径
例如:
a
6
4 5
b
1
1 e
8
7
g 4
h
2
k
终点
始点
c 2 4
d
f
33
一、有向无环图及其应用
顶点表示事件
a4=3
a1=3
边表示活动
V2
V5
V4
a3=2 a5=4
V3
V1
a7=2 a6=3
减去该活动持续的时间。
活动ak 的时间余量diff[k] =l[k]-e[k]时间余量为0者即为关键活动
36
AOE网应用:关键路径
⑴ 事件的最早发生时间ve[k] ve[k]是指从始点开始到顶点vk的最大路径长度。这 个长度决定了所有从顶点vk发出的活动能够开工的 最早时间。
12
C4 C2 C1 C3
C5
C7 C8
C12
C10
C9
C6
C11
拓扑序列:开始 ( 0)
13
C4 C2 C3 C12
C5
C4
C5
C7 C12 C8
C3
C7 C8
C9
C10 C11 拓扑序列:C1 ( 1)
C6
C9
C10
C11
C6
拓扑序列:C1--C2
( 2)
14
C4
C5
C5
C7 C12 C12
29
template <class ElemType> StatusCode TopSort(const AdjMatrixDirGraph<ElemType> &g) // 初始条件:存在有向图g // 操作结果:如g无回路,则输出g的顶点的一个拓扑序列, // 并返回SUCCESS,否则返回FAIL { int *indegree = new int[g.GetVexNum()]; //入度数组 LinkQueue<int> q; // 队列 int count = 0; StatIndegree(g, indegree); // 统计顶点的入度 for (int v = 0; v < g.GetVexNum(); v++) { // 遍历顶点 if (indegree[v] == 0) q.InQueue(v);// 建立入度为0的顶点队列 } 30
6
例 2: 课程流程图
课程编号 课程名称 先决条件 如何安排施工计划? c4 无 如何安排教学计划? c1 c2 c1,c2 c1 c1
Leabharlann Baidu
c5
c1 c2 c3 c4 c5 c6 c7
C8
c9 c10 c11 c12
程序设计 离散数学 数据结构 汇编语言 算法分析 计算机体系 编译方法 操作系统 高等数学 线性代数 电子电路 数值分析
31
一、有向无环图及其应用
2、关键路径
AOE网:在一个表示工程的带权有向图中,用顶点表示事 件,用有向边表示活动,边上的权值表示活动的持续时间 ,称这样的有向图叫做边表示活动的网,简称AOE网。 AOE网中没有入边的顶点称为始点(或源点),没有出边 的顶点称为终点(或汇点)。 AOE网的性质: ⑴ 只有在某顶点所代表的事件发生后,从该顶点出发的 各活动才能开始;
20
AOV网应用:拓扑排序
设计数据结构
1. 图的存储结构:采用邻接表存储 ,在顶点 表中增加一个入度域。
in vertex firstedge
顶点表结点
2. 栈S:存储所有无前驱的顶点。 思考:可以用队列吗?
21
AOV网应用:拓扑排序
拓扑排序
A C E B D F
in vertex firstarc
C7
C8 C9 C10 C6
C8
C9 C10 C11 C6
C11
拓扑序列:C1--C2--C3--C4 ( 4)
拓扑序列:C1--C2--C3 ( 3)
15
C7
C12 C8 C9 C10 C11 拓扑序列:C1--C2--C3--C4--C5--C7 ( 6) C12 C6
C12
C8 C9
C10
C11
0 2 1 1 0 2 0 1 3 0 4 0 5 1
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
2
F ∧
D B
26
AOV网应用:拓扑排序
拓扑排序
A D F
in vertex firstarc
0 1 0 1 0 2 0 3 0 4 0 5 1 0
A ∧ B C D E 0 0 0 3 ∧ 3 ∧ 5 ∧ 3 5 ∧
(1)拓扑排序
(2)关键路径
3
一、有向无环图及其应用
1、拓扑排序
为求解工程流程是否“合理”,通常用AOV网的 有向图表示工程流程。
AOV网( activity on vertex network )
用顶点表示活动,边表示活动的顺序关系。
4
一、有向无环图及其应用
例
某工程可分为6个子工程,若用顶点表示子工程(也称 活动), 用弧表示子工程间的顺序关系。