420 likes | 579 Views
6 图 (3). 教学目标. 熟练掌握图的概念和术语,图的邻接矩阵与邻接表两种存储方法。 熟练掌握图的遍历的概念,图的 DFS 与 BFS 方法与算法。 掌握最小生成树的概念,构造最小生成树的方法,求图的最小生成树的算法。 掌握最短路径的概念,图的单源点最短路径的求解方法。了解单源点最短路径的算法; 掌握拓扑排序和关键路径的方法 , 了解拓扑排序和关键路径的算法。. 教学内容. 6.1 图的定义和术语 6.2 图的存储表示 6.3 图的遍历 6.4 最小生成树 6.5 两点之间的最短路径问题 6.6 拓扑排序 6.7 关键路径. 回顾和复习.
E N D
教学目标 熟练掌握图的概念和术语,图的邻接矩阵与邻接表两种存储方法。 熟练掌握图的遍历的概念,图的DFS与BFS方法与算法。 掌握最小生成树的概念,构造最小生成树的方法,求图的最小生成树的算法。 掌握最短路径的概念,图的单源点最短路径的求解方法。了解单源点最短路径的算法; 掌握拓扑排序和关键路径的方法,了解拓扑排序和关键路径的算法。
教学内容 6.1 图的定义和术语 6.2 图的存储表示 6.3 图的遍历 6.4 最小生成树 6.5 两点之间的最短路径问题 6.6 拓扑排序 6.7 关键路径
回顾和复习 1)什么是图的最小生成树? 2)求解图的最小生成树有哪两种方法? 3)Prim和Kruscal算法的应用场合? 4)什么是图的单源最短路径? 5)求解图的单源最短路径和的任意两点之间的最短路径的方法分别是什么?
6.6 拓扑排序 提出问题: 1)如何判断一个有向图是否存在回路? 2)如何合理进行选课确保选修课程的顺序符合先修课的要求?
Activity On Vertex Network AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这样的有向图为顶点表示活动的网,简称AOV网。 AOV网特点: 1.AOV网中的弧表示活动之间存在的某种制约关系。 2.AOV网中不能出现回路 。 有向无环图简称为DAG图(Directed acycline Graph)
C7 C1 C2 C3 C4 C6 C5 AOV网应用举例
“拓扑排序”的相关知识 检查有向图中是否存在回路的方法之一,就是对有向图进行拓扑排序。 具体可对有向图进行如下操作: 按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。 由此所得顶点的线性序列称之为拓扑有序序列。
B A D C B A D C 例如:对于有向图 可求得拓扑有序序列:A B C D 或 A C B D 对于有向图 不能求得它的拓扑有序序列。 因为图中存在一个回路 {B, C, D}
如何进行拓扑排序? 一、从有向图中选取一个没有前驱的顶点,并输出; 二、从有向图中删去此顶点以及所有以它为尾的弧; 三、重复上述两步,直到全部顶点都被输出,或图中不存在无前驱的顶点。
c a d g e b f h a b h c d g f e 在算法中需要用定量的描述替代定性的概念 没有前驱的顶点 入度为零的顶点 删除顶点及以它为尾的弧 弧头顶点的入度减1
indegree vertex firstedge 设计数据结构 1. 图的存储结构:采用邻接表存储 ,在顶点结构体中增加一个入度域。 (也可使用独立数组inDegree[MaxVN]) 顶点结构体 2. 栈S:存储所有无前驱的顶点。 拓扑排序通常采用邻接表,这样可以取得较高的效率
F E D A B C 拓扑排序 in vertex firstedge 3 A ∧ 0 B 1 C 3 D 0 E 2 F∧ 0 1 2 3 4 5 0 3 ∧ 0 3 ∧ 0 5 ∧ 2 5 ∧ 3 (a) 一个AOV网 (b) AOV网的邻接表存储
F E D C B A 拓扑排序 in vertex firstedge 3 A ∧ 0 B 1 C 3 D 0 E 2 F∧ 0 1 2 3 4 5 0 3 ∧ 0 3 ∧ 0 5 ∧ E 2 5 ∧ 3 B
F E D C B A 拓扑排序 in vertex firstedge 3 A ∧ 0 B 1 C 3 D 0 E 2 F∧ 0 1 2 3 4 5 0 3 ∧ 0 3 ∧ 0 0 5 ∧ 2 C E 2 5 ∧ 3 B 1
F D C B A 拓扑排序 in vertex firstedge 3 A ∧ 0 B 0 C 2 D 0 E 1 F∧ 0 1 2 3 4 5 2 0 3 ∧ 0 3 ∧ 0 1 5 ∧ C 2 5 ∧ 3 B
F D B A 拓扑排序 in vertex firstedge 2 A ∧ 0 B 0 C 1 D 0 E 1 F∧ 0 1 2 3 4 5 1 0 3 ∧ 0 3 ∧ 0 5 ∧ 0 2 5 ∧ 3 D B
F D A 拓扑排序 in vertex firstedge 1 A ∧ 0 B 0 C 0 D 0 E 1 F∧ 0 1 2 3 4 5 0 0 3 ∧ 0 3 ∧ 0 5 ∧ F 2 5 ∧ 3 D A 0
F A 拓扑排序 in vertex firstedge 0 A ∧ 0 B 0 C 0 D 0 E 0 F∧ 0 1 2 3 4 5 0 3 ∧ 0 3 ∧ 0 5 ∧ F 2 5 ∧ 3 A
拓扑排序算法——伪代码 1. 栈S初始化;累加器count初始化; 2. 扫描顶点(线性)表,将没有前驱(入度为0)的顶点压栈; 3. 当栈S非空时进行循环 3.1 j=退出栈顶元素;输出j;累加器加1; 3.2 将顶点j的各个邻接点的入度减1; 3.3 将新的入度为0的顶点入栈; 4. if (count<vexnum)输出有回路信息(拓扑排序失败);
CountInDegree(G,in); //对各顶点求入度,放入数组in中 InitStack(S); //入度为零的顶点入栈 for ( i=0; i<G.vexnum; ++i) if (in[i]==0) Push(S, i); count=0; //对输出顶点计数 while (EmptyStack(S)==false) { Pop(S, v); count++; cout<<v; foreach ( v的邻接点w ){ in[w]--; // 弧头顶点的入度减一 if (in[w] == 0) Push(S, w); //入度为零的顶点入栈 } } if (count<G.vexnum) cout<<“图中有回路”;
6.7 关键路径 问题: 假设以有向网表示一个施工流图,弧上的权值表示完成该项子工程所需时间。 问:哪些子工程是“关键工程”? 即:哪些子工程将影响整个工程的完成期限?
AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的持续时间,称这样的有向图叫做边表示活动的网,简称AOE网。AOE网中没有入边的顶点称为始点(或源点),没有出边的顶点称为终点(或汇点)。AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的持续时间,称这样的有向图叫做边表示活动的网,简称AOE网。AOE网中没有入边的顶点称为始点(或源点),没有出边的顶点称为终点(或汇点)。 AOE网的性质: ⑴ 只有在某顶点所代表的事件发生后,从该顶点出发的各活动才能开始; ⑵ 只有在进入某顶点的各活动都结束,该顶点所代表的事件才能发生。
v2 a4=1 v7 a7=9 a10=2 a1=6 v5 a8=7 a2=4 v1 v9 a5=1 v3 v8 a11=4 a3=5 a6=2 a9=4 v4 v6 AOE网 事件 事件含义 v1 开工 v2活动a1完成,活动a4可以开始 v3 活动a2完成,活动a5可以开始 … ……… v9 活动a10和a11完成,整个工程完成
AOE网可以回答下列问题: • 完成整个工程至少需要多少时间? • 为缩短完成工程所需的时间, 应当加快哪些活动? 从始点(源点)到终点(汇点)的路径可能不止一条,只有各条路径上所有活动都完成了,整个工程才算完成。因此,完成整个工程所需的最短时间取决于从始点到终点的最长路径长度,即这条路径上所有活动的持续时间之和。这条路径长度最长的路径就叫做关键路径。 关键路径:在AOE网中,从始点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径称为关键路径。 关键活动:关键路径上的活动称为关键活动。
首先计算以下与关键活动有关的量: 要找出关键路径,必须找出关键活动, 即不按期完成就会影响整个工程完成的活动。 Vertex Early ⑴ 事件的最早发生时间ve[k] ⑵ 事件的最迟发生时间vl[k] ⑶ 活动的最早开始时间e[i] ⑷ 活动的最晚开始时间l[i] Vertex Late 最后计算各个活动的时间余量 l[k] - e[k],时间余量为0者即为关键活动。
vj vk ⑴ 事件的最早发生时间ve[k] ve[k]是指从始点开始到顶点vk的最大路径长度。这个长度决定了所有从顶点vk发出的活动能够开工的最早时间。 ve[1]=0 ve[k]=max{ve[j]+len<vj, vk>} (<vj, vk>∈p[k]) p[k]表示所有到达vk的有向边的集合
v2 a4=1 v7 a7=9 a10=2 a1=6 v5 a8=7 a2=4 v1 v9 a5=1 v3 v8 a11=4 a3=5 a6=2 a9=4 v4 v6 v1 v2 v3 v4 v5 v6 v7 v8 v9 ve[k]=max{ve[j]+len<vj, vk>} ve[k] 0 4 5 14 18 7 16 6 7
⑵ 事件的最迟发生时间vl[k] vl[k]是指在不推迟整个工期的前提下,事件vk允许的最晚发生时间。 vk vj vl[n]=ve[n] vl[k]=min{vl[j]-len<vk , vj>}(<vk, vj>∈s[k]) s[k]为所有从vk发出的有向边的集合
v2 a4=1 v7 a7=9 a10=2 a1=6 v5 a8=7 a2=4 v1 v9 a5=1 v3 v8 a11=4 a3=5 a6=2 a9=4 v4 v6 v1 v2 v3 v4 v5 v6 v7 v8 v9 vl[k]=min{vl[j]-len<vk , vj>} ve[k] 7 16 7 18 4 5 14 6 0 vl[k] 0 14 6 6 8 7 10 16 18
⑶ 活动的最早开始时间e[i] 若活动ai是由弧<vk, vj>表示,则活动ai的最早开始时间应等于事件vk的最早发生时间。因此,有: e[i]=ve[k]
v2 a4=1 v7 a7=9 a10=2 a1=6 v5 a8=7 a2=4 v1 v9 a5=1 v3 v8 a11=4 a3=5 a6=2 a9=4 v4 v6 v1 v2 v3 v4 v5 v6 v7 v8 v9 e[i]=ve[k] ve[k] 7 16 7 18 4 5 14 6 0 a10 a1 a2 a3 a4 a5 a6 a7 a8 a9 a11 e[i] 16 7 7 14 5 7 4 0 6 0 0
⑷ 活动的最晚开始时间l[i] 活动ai的最晚开始时间是指,在不推迟整个工期的前提下, ai必须开始的最晚时间。 若ai由弧<vk,vj>表示,则ai的最晚开始时间要保证事件vj的最迟发生时间不拖后。因此,有: l[i]=vl[j]-len<vk, vj>
v2 a4=1 v7 a7=9 a10=2 a1=6 v5 a8=7 a2=4 v1 v9 a5=1 v3 v8 a11=4 a3=5 a6=2 a9=4 v4 v6 v1 v2 v3 v4 v5 v6 v7 v8 v9 l[i]=vl[j]-len<vk, vj> vl[k] 0 14 6 6 8 7 10 16 18 a10 a1 a2 a3 a4 a5 a6 a7 a8 a9 a11 l[i] 14 16 8 7 10 0 2 3 6 6 7
v2 a4=1 v7 a7=9 a10=2 a1=6 v5 a8=7 a2=4 v1 v9 a5=1 v3 v8 a11=4 a3=5 a6=2 a9=4 v4 v6 关键活动:l[i]=e[i]的活动 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 e[i] 5 7 16 14 4 7 7 0 6 0 0 l[i] 14 16 8 7 0 2 3 6 6 7 10
本章小结 图的概念和术语,图的邻接矩阵与邻接表两种存储方法。 图的DFS与BFS2种遍历。 最小生成树的概念、方法和算法实现。 单源最短路径的概念和方法。 拓扑排序和关键路径的方法。
作业: 2.1.1, 2.1.2, 2.1.3 2.2.1, 2.2.2, 2.2.3(使用prim和kruscal方法) 2.3 2.4 2.5.1, 2.5.2, 2.5.3 3.1.3, 3.1.4 3.3 3.4
课后建议: HLoj 1014(最小生成树Prim或Kruscal) HDoj 1874,1548(单源最短路径Dijkstra) HDoj 1869(任意两点间最短路径Floyd) HDoj 1285(拓扑排序) HLoj 1019,1023,1205,1227(DFS或BFS) HLoj 1212(BFS) HDoj 1253,1072(BFS) HLoj 8861,8862,8863