第二十三讲有向无环图的应用案例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//对顶点i的邻接点的入度减1并入度为零者入栈
}//for }//while if( count<G.vexnum ) else return OK; }
return ERROR;
有向无环图的应用二------关键路径
实际问题: 假设以有向网表示一个施工流图,弧上
的权值表示完成该项子工程(工序)所需时 间。
数据结构
第七章 图
有向无环图的应用
本讲内容
有向无环图的概念 有向无环图的应用
拓扑排序 关键路径
有向无环图的应用一------拓扑排序 举例:
一个计算机应用技术专业的学 生必须学习的基础课程有:
课程 代号 C1
课程名称 高等数学
先修课程 无
c1
c3
c4 c6
c7
C2
C3 C4 C5 C6 C7
关键路径算法
第一步: 按拓扑有序排列顶点:对顶点拓 扑排序; 第二步: 按顶点wk.baidu.com扑排序顺序计算ve(j):
ve (1) 0, ve ( j ) max{ve (*) a (*, j)}
问:1) 整个工程完工至少需要多长时间?
2) 哪些子工程是影响工程进度的关键?
有向无环图的应用二------关键路径
概念: AOE网:如果在无环的带权有向图中 用弧表示一个工程中的各项活动(Activity), 用弧上的权值表示活动的持续时间(Duration), 用顶点表示事件(Event), 则这样的有向图叫做用边表示活动的网络, 简称AOE (Activity On Edges)网。
while(!StackEmpty(S)) { pop(S, i); print( i, G.vertices[i].data ); ++count;
//输出顶点并计数
for( p = G.vertices[i].firstarc; p; p=p->nextarc){ k = p->adjvex; if( !(--indegree[k]) ) Push( S, k );
法之一,是对有向图进行拓扑排序。
例如:对于下列有向图
B A C D
可求得拓扑有序序列: ABCD 或 ACBD
反之,对于下列有向图
B
A C D
不能求得它的拓扑有序序列。
因为图中存在一个回路 {B, C, D}
如何进行拓扑排序?
1、从有向图中选取一个没有前驱 的顶点,并输出之;
2、从有向图中删去此顶点以及所 有以它为尾的弧;
程序设计
离散数学 数据结构 编译原理 操作系统 计算机组成原理
无
C1 C2 C3 C2 C4 C4 C7 C2
c2
c5
用顶点表示活动,用弧表示活 动间的优先关系的有向图称为 Activity On Vertex Network(AOV-网) 前驱、后继、直接前驱、直接 后继
学习顺序:
c1 c3 c2
c4 c7 c6 c5
c2 c7 c1 c3 c4 c5 c6
拓扑排序
按照有向图给出的次序关系,由一个 偏序得到一个全序,由此所得顶点的线 性序列称之为拓扑有序序列。
拓扑排序的作用
假设以有向图表示一个工程的施工图 或程序的数据流图(AOV网),则图中不 允许出现回路。
检查有向图中是否存在回路的方
FindInDegree(G, indegree); //生成顶点入度数组indegree[ ] InitStack( S ); for(i=0; i<G.vexnum; i++) if ( !indegree[i] ) Push(S, i); //入度为零者入栈 count = 0; //对输出顶点计数
概念: 源点:入度为零的点,即工程的开始点, 在正常情况下只有一个。 汇点:出度为零的点,即工程的完成点, 在正常情况下只有一个。
AOE网的特点
在AOE网络中, 有些活动顺序进行,有 些活动并行进行;如图所示:
事件i发生后,其后继活动a( i, *)都可以开始 只有所有先导活动a(*, j)都结束后,事件j才 发生。 a(i,*) a(*,j) i j a(i,j)
重复上述两步,直至图空,或者图 不空但找不到无前驱的顶点为止。
拓扑排序算法
举例
A B D
C
E
总是删除入度为0的顶 点并输出之。
注意:拓扑排序的结 果不一定是唯一的。
拓扑排序算法描述
Status ToplogicalSort(Graph G){
// 对邻接表存储的图G进行拓扑排序,若无回路输出 //其顶点的一个拓扑序列并返回OK,否则返回ERROR
例如:
6
a
b
4
1
1 e
8
7
g 4
h
2
k
汇点
源点
5
c 2 4
d
f
从源点到各个顶点,以至从源点到汇点的路径可能不止一 条,这些路径的长度也可能不同。不同路径的活动所需的 时间虽然不同,但只有各条路径上所有活动都完成
了,整个工程才算完成。
因此,完成整个工程所需的时间取决于从 源点到汇点的最长路径长度,即在这条路 径上所有活动的持续时间之和。这条路径 长度最长的路径就叫做关键路径 ( Critical Path)。 要找出关键路径,必须找出关键活动,即 不按期完成就会影响整个工程完成的活动。 关键路径上的所有活动都是关键活动。因 此,只要找到了关键活动,就可以找到关 键路径。
定义几个与计算关键活动有关的量:
事件(顶点) i:
最早发生时间ve(i), 最晚发生时间vl(i);
活动(边) a(i,j):
最早开始时间e(i,j), 最晚开始时间l(i,j)。
于是,整个工程完工的时间就是汇点的最 早发生时间;关键路径就是路径长度最长的 路径。
几个量的解释:
①事件i的最早可能开始时间Ve(i) 是从源点到顶点i 的最长路径长度。 ②事件i的最迟允许开始时间Vl(i) 是在保证汇点在其ve时刻完成的前提下,事件i的允许 的最迟开始时间。 ③活动a(i,j)的最早可能开始时间 e(i,j) 设活动a(i,j)在弧< i , j>上,则e(i,j)是从源点到顶点i 的 最长路径长度。因此, e(i,j) =Ve(i) 。 ④活动a(i,j)的最迟允许开始时间 l(i,j) l(i,j)是在不会引起时间延误的前提下,该活动允许的 最迟开始时间。 l(i,j) = vl(j) - dur(<i, j>)。 其中,dur(<i, j>)是完成a(i,j)所需的时间。
}//for }//while if( count<G.vexnum ) else return OK; }
return ERROR;
有向无环图的应用二------关键路径
实际问题: 假设以有向网表示一个施工流图,弧上
的权值表示完成该项子工程(工序)所需时 间。
数据结构
第七章 图
有向无环图的应用
本讲内容
有向无环图的概念 有向无环图的应用
拓扑排序 关键路径
有向无环图的应用一------拓扑排序 举例:
一个计算机应用技术专业的学 生必须学习的基础课程有:
课程 代号 C1
课程名称 高等数学
先修课程 无
c1
c3
c4 c6
c7
C2
C3 C4 C5 C6 C7
关键路径算法
第一步: 按拓扑有序排列顶点:对顶点拓 扑排序; 第二步: 按顶点wk.baidu.com扑排序顺序计算ve(j):
ve (1) 0, ve ( j ) max{ve (*) a (*, j)}
问:1) 整个工程完工至少需要多长时间?
2) 哪些子工程是影响工程进度的关键?
有向无环图的应用二------关键路径
概念: AOE网:如果在无环的带权有向图中 用弧表示一个工程中的各项活动(Activity), 用弧上的权值表示活动的持续时间(Duration), 用顶点表示事件(Event), 则这样的有向图叫做用边表示活动的网络, 简称AOE (Activity On Edges)网。
while(!StackEmpty(S)) { pop(S, i); print( i, G.vertices[i].data ); ++count;
//输出顶点并计数
for( p = G.vertices[i].firstarc; p; p=p->nextarc){ k = p->adjvex; if( !(--indegree[k]) ) Push( S, k );
法之一,是对有向图进行拓扑排序。
例如:对于下列有向图
B A C D
可求得拓扑有序序列: ABCD 或 ACBD
反之,对于下列有向图
B
A C D
不能求得它的拓扑有序序列。
因为图中存在一个回路 {B, C, D}
如何进行拓扑排序?
1、从有向图中选取一个没有前驱 的顶点,并输出之;
2、从有向图中删去此顶点以及所 有以它为尾的弧;
程序设计
离散数学 数据结构 编译原理 操作系统 计算机组成原理
无
C1 C2 C3 C2 C4 C4 C7 C2
c2
c5
用顶点表示活动,用弧表示活 动间的优先关系的有向图称为 Activity On Vertex Network(AOV-网) 前驱、后继、直接前驱、直接 后继
学习顺序:
c1 c3 c2
c4 c7 c6 c5
c2 c7 c1 c3 c4 c5 c6
拓扑排序
按照有向图给出的次序关系,由一个 偏序得到一个全序,由此所得顶点的线 性序列称之为拓扑有序序列。
拓扑排序的作用
假设以有向图表示一个工程的施工图 或程序的数据流图(AOV网),则图中不 允许出现回路。
检查有向图中是否存在回路的方
FindInDegree(G, indegree); //生成顶点入度数组indegree[ ] InitStack( S ); for(i=0; i<G.vexnum; i++) if ( !indegree[i] ) Push(S, i); //入度为零者入栈 count = 0; //对输出顶点计数
概念: 源点:入度为零的点,即工程的开始点, 在正常情况下只有一个。 汇点:出度为零的点,即工程的完成点, 在正常情况下只有一个。
AOE网的特点
在AOE网络中, 有些活动顺序进行,有 些活动并行进行;如图所示:
事件i发生后,其后继活动a( i, *)都可以开始 只有所有先导活动a(*, j)都结束后,事件j才 发生。 a(i,*) a(*,j) i j a(i,j)
重复上述两步,直至图空,或者图 不空但找不到无前驱的顶点为止。
拓扑排序算法
举例
A B D
C
E
总是删除入度为0的顶 点并输出之。
注意:拓扑排序的结 果不一定是唯一的。
拓扑排序算法描述
Status ToplogicalSort(Graph G){
// 对邻接表存储的图G进行拓扑排序,若无回路输出 //其顶点的一个拓扑序列并返回OK,否则返回ERROR
例如:
6
a
b
4
1
1 e
8
7
g 4
h
2
k
汇点
源点
5
c 2 4
d
f
从源点到各个顶点,以至从源点到汇点的路径可能不止一 条,这些路径的长度也可能不同。不同路径的活动所需的 时间虽然不同,但只有各条路径上所有活动都完成
了,整个工程才算完成。
因此,完成整个工程所需的时间取决于从 源点到汇点的最长路径长度,即在这条路 径上所有活动的持续时间之和。这条路径 长度最长的路径就叫做关键路径 ( Critical Path)。 要找出关键路径,必须找出关键活动,即 不按期完成就会影响整个工程完成的活动。 关键路径上的所有活动都是关键活动。因 此,只要找到了关键活动,就可以找到关 键路径。
定义几个与计算关键活动有关的量:
事件(顶点) i:
最早发生时间ve(i), 最晚发生时间vl(i);
活动(边) a(i,j):
最早开始时间e(i,j), 最晚开始时间l(i,j)。
于是,整个工程完工的时间就是汇点的最 早发生时间;关键路径就是路径长度最长的 路径。
几个量的解释:
①事件i的最早可能开始时间Ve(i) 是从源点到顶点i 的最长路径长度。 ②事件i的最迟允许开始时间Vl(i) 是在保证汇点在其ve时刻完成的前提下,事件i的允许 的最迟开始时间。 ③活动a(i,j)的最早可能开始时间 e(i,j) 设活动a(i,j)在弧< i , j>上,则e(i,j)是从源点到顶点i 的 最长路径长度。因此, e(i,j) =Ve(i) 。 ④活动a(i,j)的最迟允许开始时间 l(i,j) l(i,j)是在不会引起时间延误的前提下,该活动允许的 最迟开始时间。 l(i,j) = vl(j) - dur(<i, j>)。 其中,dur(<i, j>)是完成a(i,j)所需的时间。