1 / 24

数据结构

计算机科学与技术(本科)专业. 数据结构. 第十一讲 图的应用. 目 录. ● 最小生成树. ● 活动网络. ● 单源最短路径简介. §8.4 最小生成树 (Minimum-cost Spanning Tree). 一、 MST 概述. 1 、 ST—— 对于有 n 个顶点的连通图,包括所有的顶点和仅能将这些顶点连通在一起的最少条边( n – 1 )的子图(又名极小连通子图),即为该连通图的生成树( ST ).

garth
Download Presentation

数据结构

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 计算机科学与技术(本科)专业 数据结构 第十一讲 图的应用

  2. 目 录 ●最小生成树 ● 活动网络 ● 单源最短路径简介

  3. §8.4 最小生成树(Minimum-cost Spanning Tree) 一、MST概述 1、ST——对于有n个顶点的连通图,包括所有的顶点和仅能将这些顶点连通在一起的最少条边(n – 1)的子图(又名极小连通子图),即为该连通图的生成树(ST) 2、ST的多样性——对图遍历时访问的结点和经由的边就构成了生成树,因遍历的路径和选择的起始点的不同,所经由边也不同,所以一个连通图的ST有多个方案 3、MST • 连通图的边带有权值,则连通图又称为网络 • 在网络中边上权值之和最小的生成树叫MST • MST是一个具有应用价值的问题 • 在已知网络中求MST的方法有Kruscal和Prim两种最常用

  4. 28 0 1 0 1 10 10 16 16 14 14 2 3 4 2 3 4 18 24 12 12 25 25 5 6 5 6 22 22 (b)Kruscal求解MST过程图 (a)带权连通图 二、克鲁斯卡尔算法 1、思路描述 • 最初构造只有n个顶点没有边的n个连通分量的集合 • 每次选出权值最小且两端点在不同连通分量上的边 • 将这个边加入到集合中,使图的连通分量数减 1 • 重复以上两步,直到集合中只有一个连通分量为止

  5. 2、存贮结构 0 1 2 3 4 5 6 0 1 2 3 4 5 6 • 图采用邻接矩阵 • 利用最小堆MinHeap存放所有边,堆(边)结点格式: • 借助并查集UFSets实现运算

  6. 3、最小生成树类声明 const float Maxnum=机器可表示的极大数; class MinSpanTree; class MSTEdgeNode{ //MST边结点声明 friend class MinSpanTree; private: int tail, head; float cost; public: MSTEdgeNode( ): tail(-1), head(-1), cost(0){ } }; class MinSpanTree: public Graph<Type> { //MST类定义 protected: MSTEdgeNode * edgevalue; //用边值数组表示树 int MaxSize, n; //数组元素的最大个数和当前个数 public: MinSpanTree(int sz = NumofVertices( ) - 1): MaxSize(sz), n(0) {edgevalue = new MSTEdgeNode [MaxSize];} int Insert (MSTEdgeNode & item); void Kruscal (MinSpanTree & T ); }

  7. 4、求解最小生成树的实现 void MinSpanTree :: Kruscal (MinSpanTree &T ){ MSTEdgeNode e; MinHeap<MSTEdgeNode> H (currentEdges); //用最小堆存边 int NumVertices = VerticesList.last+1, u, v; UFSetes F(NumVertices); //用并查集表示连通分量 for (u = 0; u < NumVertices; u + +) //建立最小堆的数据 for (v = 0; v < NumVertices; v + +) if (Edge[u][v]!=Maxnum && Edge[u][v]!=0) {e.tail=u; e.head=v; e.cost=Edge[u][v]; H.Insert(e);} int count=0; //生成树边的计数 while(count < NumVertices) { //反复执行,取 n-1 条边 H.RemoveMin(e); //从最小堆中退出具有最小值的边 u=F.Find(e.tail); v=F.Find(e.head); if(u != v){ //两顶点所在集合的根不是同一集合,属不连通 F.Union(u,v); T.Insert(e); count + +;} } }

  8. 三、普里姆算法 0 1 28 0 1 10 10 16 16 14 14 2 3 4 2 3 4 18 24 12 12 25 25 5 6 5 6 22 22 (b) Prim求解MST过程图 (a)带权连通图 U={0, } 2, 5, 6, 4, 1, 3 1、思路描述 从某顶点u0出发,选择与之关联并具有最小权值的边( u0,v),将顶点v加入到U中 以后每次从一个顶点在U中,另一个不在U中且具有最小权值的边(u,v),将顶点V加入到U中,直到所有顶点都加入到U为止。

  9. 28 0 1 10 16 14 2 3 4 18 24 12 25 5 6 22 lowcost[ ]存放U中各顶点到U之外各顶点边上当前的最小权值 nearvex[ ]记录U之外各顶点到U之内哪个顶点权值最小 举例

  10. lowcost 0 1 2 3 4 5 6 0 28 10 nearvex 0 1 2 3 4 5 6 U={0} 选V=2 -1 0 0 0 0 0 0 0 28 10 25 -1 0 -1 0 0 2 0 U={0,2} 选V=5 0 28 10 24 25 22 -1 0 -1 5 0 -1 5 U={0,2,5} 选V=6 U={0,2,5,6} 0 28 10 18 12 25 22 -1 0 -1 6 6 -1 -1 选V=4 28 0 1 10 16 14 2 3 4 18 24 12 25 5 6 22

  11. §8.5 活动网络(Activity Network) C0 C0 —— 数据结构 C1 —— 操作系统 C2 —— 组成原理 C3 —— 数据库系统 C4 —— 面向对象程序设计 C5 —— 计算机网络 C4 C3 C1 C5 C2 一、用顶点表示活动的网络 1、顶点表示活动(activity on vertices AOV) • AOV是用以表示一个工程的有向图 • 图中的顶点表示一项子工程,即活动 • 弧表示两活动之间的先后次序 • 以计算机专业课程学习工程为例

  12. 2、拓扑排序(topological sorting) C0 C6 C7 C4 C3 C1 C8 C5 C2 对于AOV,将所有顶点排成一个线性有序序列,使所有存在的前驱和后继关系都得到满足,该操作叫拓扑排序 对上例AOV,拓扑排序就可得到一个课程进度表: C4, C0, C3, C2, C1, C5或 C2, C4, C0, C3, C1, C5等 一般拓扑排序方案并非唯一 具有有向环的有向图无法进行拓扑排序,例如

  13. 3、拓扑排序的方法 C4 C0 C1 C3 C5 C2 在AOV中选一个没有前驱的结点,并输出之 在图中删除该顶点和以它为尾的所有弧 重复以上两步,或输出所有顶点,组成拓扑序列;或输出部分顶点,其它顶点必构成有向环 举例

  14. 3、拓扑排序的方法 在AOV中选一个没有前驱的结点,并输出之 在图中删除该顶点和以它为尾的所有弧 重复以上两步,或输出所有顶点,组成拓扑序列;或输出部分顶点,其它顶点必构成有向环 举例 C4 C0 输出的拓扑序列: C4 , C0 , C3 , C2 , C1 , C5 C1 C3 所有顶点输出,无有向环 C5 C2

  15. 4、存贮表示和辅助数组 1 C0 C4 C0 1 3 ∧ 0 3 C1 1 5 C1 C3 0 C2 2 1 5 ∧ 1 C3 ∧ 3 dest link C5 C2 0 C4 4 0 1 5 ∧ 3 C5 ∧ 5 count data adj AOV网采用邻接表存贮 设置辅助数组count记录各顶点的入度 以计算机专业课程学习工程AOV为例 删除以某顶点为尾的弧是用对应邻接点入度减1来实现

  16. 利用count数组中入度为0的分量空间构造一个存放入度为0的顶点的链式栈,拓扑排序中其栈顶指针top变化情况: C4 C0 C1 C3 C5 C2

  17. 利用count数组中入度为0的分量空间构造一个存放入度为0的顶点的链式栈,拓扑排序中其栈顶指针top变化情况: -1 -1 -1 -1 0 2 0 0 0 0 0 -1 1 2 1 1 1 1 1 1 1 1 2 0 -1 -1 -1 3 2 2 2 2 2 3 1 4 1 2 3 3 3 3 3 top -1 2 1 5 4 4 4 4 4 1 建链栈 顶点2出栈 顶点5出栈 3 2 2 2 -1 顶点0出栈 顶点3出栈 顶点1出栈 顶点4出栈 5 5 5 5 5 2 C4 C0 4 3 5 C1 C2 C3 C5

  18. 5、拓扑排序的算法 void Graph :: TopologicalSort( ){ //对有n个顶点的AOV拓扑排序 int top= -1; //置栈空 for (int i = 0; i < n; i + +) // 建入度为0顶点的链栈 if (count[i] = = 0){count[i] = top; top = i;} // 进栈运算 for (i = 0; i < n; i + +) if (top = = -1){cout <<"Network has a cycle"<<endl; return;} else { int j = top; top = count[top]; //入度为0的顶点出栈 cout<<j<<endl; Edge<float> * p = NodeTable[j].adj; while (p != NULL){ // 删掉以j为尾的弧 int k = p -> dest; if(- - count[k] = = 0){count[k] = top; top = k;} //入度为0则进栈 p = p -> link; } }} ☆时间复杂度为O(n + e)

  19. 二、用边表示活动的网络 a4=1 a10=2 a1=6 1 6 a7=9 源点 汇点 图一 0 8 a2=4 a8=7 4 a5=1 a11=4 2 7 a3=5 a9=4 a6=2 3 5 1、边表示活动(activity on edges AOE) 有向边表示一个工程中的各项活动,边上的权值表示活动持续的时间(duration) 顶点表示事件(event),事件的发生说明在它之前的活动已完成,而在它之后的活动可以开始 AOE举例(包括11个活动和9个事件) AOE的意义在于估算整个工程完成的最少时间以及如何缩短工期

  20. 2、关键路径和关键活动 a4=1 a10=2 a1=6 1 6 a7=9 源点 汇点 图一 0 8 a2=4 a8=7 4 a5=1 a11=4 2 7 a3=5 a9=4 a6=2 3 5 从源点到汇点可能有多条有向路径,路径上各活动所需时间之和叫该路径的路径长度 具有最大路径长度的路径叫做关键路径,图一的关键路径有a1, a4, a7, a10和 a1, a4, a8, a11,它们的路径长度均为18 关键路径上的所有活动都叫做关键活动,对图一的AOE,关键活动是a1, a4, a7, a8, a10 , a11 关键活动上持续时间的变化可能影响整个工程的工期

  21. 3、事件和活动的若干量 a4=1 a10=2 a1=6 1 6 a7=9 源点 汇点 图一 0 8 a2=4 a8=7 4 a5=1 a11=4 2 7 a3=5 a9=4 a6=2 3 5 事件Vi的最早可以开始时间Ve[i]:是从源点V0到顶点Vi的最长路径长度。如Ve[4] = 6 + 1 = 7 Ve[5]=5+2=7 事件Vi的最迟允许开始时间Vl[i]:是工程按期完成情况下Vi的最迟允许开始时间。如Vl[4] = 18 – (4 + 7) = 7, Vl[5] = 18 – (4 + 4) = 10。在关键路径上有Ve[i]=Vl[i] 活动ak的最早可以开始时间e[k]:设ak是在< Vi, Vj>上,e[k]是从源点到Vi的最长路径长度,故e[k] = Ve[i],例如,e[4] = Ve[1] = 6,e[6] = Ve[3] = 5

  22. 3、事件和活动的若干量 a4=1 a10=2 a1=6 1 6 a7=9 源点 汇点 图一 0 8 a2=4 a8=7 4 a5=1 a11=4 2 7 a3=5 a9=4 a6=2 3 5 活动ak的最迟允许开始时间l[k]:是工程按期完成情况下ak的最迟允许开始时间,设ak在< Vi, Vj>上,并ak的持续时间为dur(<i, j>),l[k] = Vl[j] - dur (<i, j>)。例如, l[4] = Vl[4] - dur (<1, 4>) = 7 – 1 = 6 l[6] = Vl[5] - dur (<3, 5>) = 10 – 2 = 8 活动ak的时间余量:是l[k] – e[k],例如 a6的时间余量l[6] – e[6] = 8 – 5 = 3 a4的时间余量l[4] – e[4] = 6 – 6 = 0,对关键活动有l[k] = e[k]

  23. 4、求关键路径的方法 • 从V0开始,求解AOE顶点的拓扑排序序列 • 按拓扑序列次序,从V0开始求各事件的Ve[i] • 按逆拓扑序列次序,从Vn-1开始求各事件的Vl[i] • 根据Ve[i]和Vl[i],求各活动的e[k]和l[k] • e[k] = l[k]的活动为关键活动,输出关键活动

  24. §8.6 单源最短路径问题简介 一、Dijkstra 求解最短路径的方法: 带权有向图 开始S={0}, 求出长度最短的一条最短路径<0,i>,S={0,i},然后在经由i的情况下求长度次短的一条路径。依此类推,直到求出到所有顶点的最短路径。 0 10 100 30 1 4 10 50 60 2 3 20 二、Dijkstra 逐步求解的过程举例 S集合 顶点1 顶点2 顶点3 顶点4 0 10(v0 ,v1) ---- 30 100 0,1 60 30(v0 ,v3) 100 0,1,3 50(v0 ,v3,v2) 90 0,1,3,2 60(v0,v3,v2,v4)

More Related