图的拓扑排序和生成树.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
关键路径
a1=6 V1
V2
a4=1 V5
a7=9
V7
a10=2 V9
a2=4
V3
a5=1
a3=5 V4
a8=7
V8 a9=4
a11=4
a6=2 V6
12
事件V1之前的活动就是以 V1 为头的弧表 示的活动, V1之后的活动是以V1为尾的弧表 示的活动。如 V5之前的活动是a4, a5; V5之后 的活动是a7, a8 。
6
如何进行拓扑排序?
一、从有向图中选取一个没有前驱 的顶点,并输出之;
二、从有向图中删去此顶点以及所 有以它为尾的弧; 重复上述两步,直至图空,或者 图不空但找不到无前驱的顶点为止。
7
c a g b h f d e
a
b h c d g f
e
在算法中需要用定量的描述替代定性的概念
没有前驱的顶点 入度为零的顶点 删除顶点及以它为尾的弧 弧头顶点的入度减1
8
J1 J2
J3
J4
J5
J6
J7
0
1
0
1
0 0
2Leabharlann Baidu
2 1
2
2 1
1
1 0
1
1 1 1 0 0
打印J1
打印J2 打印J3 打印J4 打印J5 打印J7
0
0
1
0 0
0
1 打印J6
使用队列对图11.1所示图进行拓扑排序,其顶点的打印顺序 将是J1,J2,J3,J6,J4,J5,J7 9
Queue-Based Topsort
void topsort(Graph* G, Queue<int>* Q) { int Count[G->n()]; int v, w; for (v=0; v<G->n(); v++) Count[v] = 0; for (v=0; v<G->n(); v++) // Process edges for (w=G->first(v); w<G->n(); w = G->next(v,w)) Count[w]++; // Add to v2's count for (v=0; v<G->n(); v++) // Initialize Q if (Count[v] == 0) // No prereqs Q->enqueue(v); while (Q->length() != 0) { Q->dequeue(v); printout(v); // PreVisit for V for (w=G->first(v); w<G->n(); w = G->next(v,w)) { Count[w]--; // One less prereq if (Count[w] == 0) // Now free Q->enqueue(w); } } 10 }
事件 V1 的发生表示 V1 之前的活动已完成,
V1之后的活动可以开始,(但不一定马上开始)。 对此假想工程有:
13
a1=6 V1: 工程开始
V2
a4=1
V7 a7=9
a10=2
V1
a2=4
V5
a5=1
V9 a8=7 V8 a9=4 a11=4
V2: a1完成, a4可以开始 V3: a2完成, a5可以开始 V4: a3完成, a6可以开始
拓扑排序 (3)
void topsort(Graph* G) { // Topological sort int i; for (i=0; i<G->n(); i++) // Initialize G->setMark(i, UNVISITED); for (i=0; i<G->n(); i++) // Do vertices if (G->getMark(i) == UNVISITED) tophelp(G, i); // Call helper } void tophelp(Graph* G, int v) { // Process v G->setMark(v, VISITED); for (int w=G->first(v); w<G->n(); w = G->next(v,w)) if (G->getMark(w) == UNVISITED) tophelp(G, w); printout(v); // PostVisit for Vertex v }
将一个DAG中所有顶点在不违反先决条件规定的基 础上排成线性序列的过程称为拓扑排序
2
拓扑排序 (2)
3
由此所得顶点的线性序列称之为 拓扑有序序列
例如:对于下列有向图
B A C D
可求得拓扑有序序列: ABCD 或 ACBD
5
反之,对于下列有向图
B
A C D
不能求得它的拓扑有序序列。 因为图中存在一个回路 {B, C, D}
V3 a3=5
V4
a6=2 V6
V5: a4, a5完成, a7, a8可以开始
V6: a6完成, a9可以开始 V7: a7完成, a10可以开始 V8: a8, a9完成, a11可以开始 V9: a10, a11完成, 即工程结束
14
注:工程开始,某些活动可以同时执行,但不一 定要同时执行。某一事件发生前,在它之后 的活动不能开始执行,(如v2, v3发生之前,a4, a5不能执行)
数据结构与算法分析
第11章
图
1
拓扑排序Topological Sort (1)
问题: 给定一组有先决条件约束的工作、课程等, 希望 以某种线性顺序组织这些任务,且不违反任何的先 决条件.
可以用一个有向无环图(DAG)来模拟这个问题。因为 任务之间存在先决条件关系,即顶点之间有方向性, 因此图是有方向的。图又需要是无回路的,因为回 路中隐含了相互冲突的条件,从而使某些条件不可 能在不违反任何先决条件的情况下得到实现.
正常情况下,整个工程只有一个开始点和一 个完成点。在AOE网中
开始点:(即入度为零的点)称为源点
完成点:(出度为零的点)称为汇点
15
关键路径
与AOV网不同。对AOE网要研究的问题是: 1) 完成整个工程至少需多少时间?
2) 哪些活动是影响工程进度的关键?
16
术语
• 关键路径(criticed path):从源点到汇点的最长路径叫关键 路径,其路径长度是该路径上活动持续时间之和. 也是工 程完成的最少时间. • 事件最早发生时间:从源点到事件Vi的最长路径长度,称 为Vi的最早发生时间. 用Ve(i)表示. Ve(i)也决定了所有Vi 之后的活动的最早可以开始时间. • 事件最迟发生时间:不影响整个工程进度,而Vi可最迟发 生的时间称为Vi的最迟发生时间. 用Vl(i)表示. • 活动最早开始时间:活动ai最早可以开始进行的时间. 用e(i) 表示. • 活动最迟开始时间:在不推迟整个工程完成的前提下,活 动ai最迟必须开始进行的时间,用l(i)表示. • 关键活动:活动时间余量为0的活动. 即l(i)e(i)=0的活动. 关键路径上的所有活动都是关键活动. • 非关键活动:不在关键路径上的活动.
关键路径
a1=6 V1
V2
a4=1 V5
a7=9
V7
a10=2 V9
a2=4
V3
a5=1
a3=5 V4
a8=7
V8 a9=4
a11=4
a6=2 V6
12
事件V1之前的活动就是以 V1 为头的弧表 示的活动, V1之后的活动是以V1为尾的弧表 示的活动。如 V5之前的活动是a4, a5; V5之后 的活动是a7, a8 。
6
如何进行拓扑排序?
一、从有向图中选取一个没有前驱 的顶点,并输出之;
二、从有向图中删去此顶点以及所 有以它为尾的弧; 重复上述两步,直至图空,或者 图不空但找不到无前驱的顶点为止。
7
c a g b h f d e
a
b h c d g f
e
在算法中需要用定量的描述替代定性的概念
没有前驱的顶点 入度为零的顶点 删除顶点及以它为尾的弧 弧头顶点的入度减1
8
J1 J2
J3
J4
J5
J6
J7
0
1
0
1
0 0
2Leabharlann Baidu
2 1
2
2 1
1
1 0
1
1 1 1 0 0
打印J1
打印J2 打印J3 打印J4 打印J5 打印J7
0
0
1
0 0
0
1 打印J6
使用队列对图11.1所示图进行拓扑排序,其顶点的打印顺序 将是J1,J2,J3,J6,J4,J5,J7 9
Queue-Based Topsort
void topsort(Graph* G, Queue<int>* Q) { int Count[G->n()]; int v, w; for (v=0; v<G->n(); v++) Count[v] = 0; for (v=0; v<G->n(); v++) // Process edges for (w=G->first(v); w<G->n(); w = G->next(v,w)) Count[w]++; // Add to v2's count for (v=0; v<G->n(); v++) // Initialize Q if (Count[v] == 0) // No prereqs Q->enqueue(v); while (Q->length() != 0) { Q->dequeue(v); printout(v); // PreVisit for V for (w=G->first(v); w<G->n(); w = G->next(v,w)) { Count[w]--; // One less prereq if (Count[w] == 0) // Now free Q->enqueue(w); } } 10 }
事件 V1 的发生表示 V1 之前的活动已完成,
V1之后的活动可以开始,(但不一定马上开始)。 对此假想工程有:
13
a1=6 V1: 工程开始
V2
a4=1
V7 a7=9
a10=2
V1
a2=4
V5
a5=1
V9 a8=7 V8 a9=4 a11=4
V2: a1完成, a4可以开始 V3: a2完成, a5可以开始 V4: a3完成, a6可以开始
拓扑排序 (3)
void topsort(Graph* G) { // Topological sort int i; for (i=0; i<G->n(); i++) // Initialize G->setMark(i, UNVISITED); for (i=0; i<G->n(); i++) // Do vertices if (G->getMark(i) == UNVISITED) tophelp(G, i); // Call helper } void tophelp(Graph* G, int v) { // Process v G->setMark(v, VISITED); for (int w=G->first(v); w<G->n(); w = G->next(v,w)) if (G->getMark(w) == UNVISITED) tophelp(G, w); printout(v); // PostVisit for Vertex v }
将一个DAG中所有顶点在不违反先决条件规定的基 础上排成线性序列的过程称为拓扑排序
2
拓扑排序 (2)
3
由此所得顶点的线性序列称之为 拓扑有序序列
例如:对于下列有向图
B A C D
可求得拓扑有序序列: ABCD 或 ACBD
5
反之,对于下列有向图
B
A C D
不能求得它的拓扑有序序列。 因为图中存在一个回路 {B, C, D}
V3 a3=5
V4
a6=2 V6
V5: a4, a5完成, a7, a8可以开始
V6: a6完成, a9可以开始 V7: a7完成, a10可以开始 V8: a8, a9完成, a11可以开始 V9: a10, a11完成, 即工程结束
14
注:工程开始,某些活动可以同时执行,但不一 定要同时执行。某一事件发生前,在它之后 的活动不能开始执行,(如v2, v3发生之前,a4, a5不能执行)
数据结构与算法分析
第11章
图
1
拓扑排序Topological Sort (1)
问题: 给定一组有先决条件约束的工作、课程等, 希望 以某种线性顺序组织这些任务,且不违反任何的先 决条件.
可以用一个有向无环图(DAG)来模拟这个问题。因为 任务之间存在先决条件关系,即顶点之间有方向性, 因此图是有方向的。图又需要是无回路的,因为回 路中隐含了相互冲突的条件,从而使某些条件不可 能在不违反任何先决条件的情况下得到实现.
正常情况下,整个工程只有一个开始点和一 个完成点。在AOE网中
开始点:(即入度为零的点)称为源点
完成点:(出度为零的点)称为汇点
15
关键路径
与AOV网不同。对AOE网要研究的问题是: 1) 完成整个工程至少需多少时间?
2) 哪些活动是影响工程进度的关键?
16
术语
• 关键路径(criticed path):从源点到汇点的最长路径叫关键 路径,其路径长度是该路径上活动持续时间之和. 也是工 程完成的最少时间. • 事件最早发生时间:从源点到事件Vi的最长路径长度,称 为Vi的最早发生时间. 用Ve(i)表示. Ve(i)也决定了所有Vi 之后的活动的最早可以开始时间. • 事件最迟发生时间:不影响整个工程进度,而Vi可最迟发 生的时间称为Vi的最迟发生时间. 用Vl(i)表示. • 活动最早开始时间:活动ai最早可以开始进行的时间. 用e(i) 表示. • 活动最迟开始时间:在不推迟整个工程完成的前提下,活 动ai最迟必须开始进行的时间,用l(i)表示. • 关键活动:活动时间余量为0的活动. 即l(i)e(i)=0的活动. 关键路径上的所有活动都是关键活动. • 非关键活动:不在关键路径上的活动.