1、1,数 据 结 构,7.1 图的定义与相关术语,7.2 图的存储结构,7.4 最小生成树,第 7 章 图,7.3 图的遍历,7.5 最短路径,7.5.2 关键路径,7.5.1 拓扑排序,2,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,图的结构定义:,图是由顶点集 V 和弧集 R构成的数据结构。Graph = (V , E ),其中: V=|vDataObject R=EE=| P(v,w)且(v,wV)表示从 v 到 w 的一条弧,并称 v 为弧尾,w 为弧头。谓词 P(v,w) 定义了弧 的意义或信息, 表示从v到w的一条单向通道。,3,数 据 结 构,7.1 图的定义与相关
2、术语,第 7 章 图,有向图,:由于“弧”是有方向的,因此称由顶点集和弧集构成的图为有向图。,例如:,其中 V1=A, B, C, D, E E1=, , , , , , ,4,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,无向图,:由顶点集和边集构成的图称作无向图。,例如:,其中 V2=A,B,C,D,E,F E2=(A,B),(A,E),(B,E),(C,D),(D,F),(B,F),(C,F),若 VR 必有 VR, 则以(v,w)代 替这两个有序对,称v 和 w之间存在一条边。,5,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,假设图中有 n
3、 个顶点,e 条边,则,含 e=n(n-1)/2 条边的无向图称作完全图;,含 e=n(n-1) 条弧的有向图称作有向完全图;,若边或弧的个数 enlogn,则称作稀疏图,,否则称作稠密图。,6,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,若无向图顶点v 和w 之间存在一条边(v,w),则称顶点v 和w 互为邻接点,称边(v,w)依附于顶点v 和w 或边(v,w)与顶点v 和w相关联。,与顶点v 关联的边的数目定义为v的度(ID)。,例如:,ID(B) =,ID(A) =,3,2,7,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,对
4、于有向图,若顶点v 和w 之间存在一条弧则称顶点v邻接到顶点w,顶点w邻接自顶点v,称弧与顶点v 和w 相关联。,以v为尾的弧的数目定义为v的出度(OD)。,例如:,OD(B)=,ID(B)=,以v为头的弧的数目定义为v的入度(ID)。,出度+入度=该顶点的度(TD),TD(B)=,1,2,3,8,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,设图G=(V,VR)中的 u=vi,0,vi,1, , vi,m=w顶点序列中, 有 (vi,j-1,vi,j)VR 1jm, 则称从顶点u到顶点w之间存在一条路径。路径上边的数目称作路径长度,有向图的路径也是有向的。,例如
5、:,路径A,E,C,D,B,C,D,路径长度为6,9,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,回路:首尾顶点相同的路径。,简单路径:顶点不重复的路径。,A,E,C,D,简单回路:中间顶点不重的回路,B,C,D,B,A,E,C,D,B,C,D,A,A,E,C,D,A,10,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,例如:,设图G=(V,VR) 和图 G=(V,VR), 且 VV, VRVR,则称 G 为 G 的子图。,A,11,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,若无向图G中任意两个顶点
6、之间都有路径相通,则称此图为连通图。,若无向图为非连通图,则图中各个 极大连通子图称作此图的连通分量。,B,A,E,C,F,D,12,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,对有向图, 若任意两个顶点之间都存在一条有向路径,则称此有向图为强连通图。,否则,其各强连通子图称作它的强连通分量。,B,C,D,A,E,13,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小连通子图, 称该极小连通子图为此连通图的生成树。,A,B,C,D,F,E,14,数
7、 据 结 构,7.1 图的定义与相关术语,第 7 章 图,名词和基本术语,对非连通图,则称由各个连通分量的生成树的集合为此非连通图的生成森林。,A,B,C,D,E,F,15,有向图或无向图中的弧或边带权 后的图分别称作有向网或无向网。,数 据 结 构,7.1 图的定义与相关术语,第 7 章 图,16,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接矩阵表示法,图的邻接表表示法,有向图的十字链表表示法,无向图的邻接多重表表示法,17,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接矩阵表示法,(数组表示法),一维数组:,二维数组:,用于存储顶点信息。,用于存储图中顶点之间
8、关联关系,邻接矩阵,0,1,0,0,1,0,1,0,0,0,1,1,0,0,0,1,0,1,0,0,1,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,A B C D E F,A B C D E F,无向图,对 称 矩 阵,18,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接矩阵表示法,(数组表示法),一维数组:,二维数组:,用于存储顶点信息。,用于存储图中顶点之间关联关系,邻接矩阵,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,0,0,A B C D E,A B C D E,有向图,非 对 称 矩 阵,19,数 据 结
9、构,7.2图的存储结构,第 7 章 图,图的邻接矩阵表示法,(数组表示法),一维数组:,二维数组:,用于存储顶点信息。,用于存储图中顶点之间关联关系,邻接矩阵,15,9,3,2,11,7,21,A B C D E,A B C D E,wij,有向网,非 对 称 矩 阵,20,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接矩阵表示法,(数组表示法),特点:,.存储空间,.便于运算,无向图:,n(n-1)/2,有向图(网):,n2,无向图:,有向图(网):,21,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接表表示法,(链式存储法),.表头结点,.表结点,对图中每个顶点
10、建立一个单链表,第i个 单链表中的结点表示依附于顶点vi的边。,图,网,22,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接表表示法,(链式存储法),23,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接表表示法,(链式存储法),24,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接表表示法,(链式存储法),25,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接表表示法,(链式存储法),特点:,.无向图存储空间:,.,n+2e,无向图:,TD(vi)= 第i个单链表上结点的个数,有向图(网):,OD(vi)=第i个单链表上结点的个数,ID(vi
11、)扫描整个邻接表,逆邻接表,26,数 据 结 构,7.2图的存储结构,第 7 章 图,图的邻接表表示法,(链式存储法),逆邻接表,27,数 据 结 构,7.2图的存储结构,第 7 章 图,有向图的十字链表表示法,(链式存储法),顶点和弧分别各用一种存储结构的结点表示。弧头 相同的弧被链在同一链表上,弧尾相同的弧也被链 在同一链表上,链表的头结点就是顶点结点。,弧的结点结构,顶点的结点结构,28,数 据 结 构,7.2图的存储结构,第 7 章 图,有向图的十字链表表示法,29,数 据 结 构,7.2图的存储结构,第 7 章 图,无向图的邻接多重表表示法,顶点和边分别各用一种存储结构的结点表示。依
12、附于相同 顶点的边被链在同一链表上,每条边依附于两个顶点,所 以每个边结点同时被链接在两个链表中,链表的头结点就 是顶点结点。同时还在边结点中增加了一个访问标志位。,边的结点结构,顶点的结点结构,30,数 据 结 构,7.2图的存储结构,第 7 章 图,无向图的邻接多重表表示法,31,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,0,0,0,1,1,0,0,A B C D E,A B C D E,32,数 据 结 构,7.3 图的遍历,第 7 章 图,从图中某个顶点出发遍历图,访遍图中其余顶 点,并且使图中的每个顶点仅被访问一次的过程。,深度优先搜索,广度优先搜索,3
13、3,数 据 结 构,7.3 图的遍历,第 7 章 图,深度优先搜索,基本思想:,.从图中某个顶点v0出发,首先访问v0 ;,类似于树的先根次序遍历,.找出刚访问过的顶点的第一个未被访问的邻接点,然后访问该顶点。以该顶点为新顶点,重复此步骤,直到刚访问过的顶点没有未被访问的邻接点为止;,.返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的邻接点,访问该顶点。然后执行步骤。,34,数 据 结 构,7.3 图的遍历,第 7 章 图,深度优先搜索,例如:,A,B,C,A,B,C,F,E,F,E,G,G,D,D,H,H,I,I,回到A 结束!,深 度 优 先 搜 索 树,35,
14、数 据 结 构,7.3 图的遍历,第 7 章 图,深度优先搜索,算法思想:,递归,.访问出发点v0 ;,.依次以v0的未被访问的邻接点为出发点,深度优先搜索图,直至图中所有与v0有路径相通的顶点都被访问。,对于非连通图,则图中一定还有顶点未被访 问,要从图中另选一个未被访问的顶点作为 起始点,重复上述深度优先搜索过程。,36,数 据 结 构,深度优先搜索,深度优先遍历图g的算法描述,void DFS(int *visited, int v) /* visited数组存储顶点的遍历情况 */ GraphNode *p;visitedv=1; /* 已访问的顶点,visitedv置为1 */pri
15、ntf(“%d-“,v);p=Graphv.next; /* p指向第v个顶点的第一个邻接点 */while(p!=NULL) if(visitedp-data=0)DFS(visited,p-data); /* 递归调用 */p=p-next; ,37,数 据 结 构,7.3 图的遍历,第 7 章 图,深度优先搜索,非递归形式的DepthFirstSearch,.首先将v0入栈;,.只要栈不空,则重复下述处理:,a.栈顶顶点出栈,如果未访问,则访问并置访问标志;,b.然后将v0所有未访问的邻接点入栈。,A,A,1,E,D,B,B,1,E,C,C,1,F,F,1,E,1,G,G,1,H,D,D
16、,1,H,1,I,I,1,38,数 据 结 构,7.3 图的遍历,第 7 章 图,广度优先搜索,基本思想:,.从图中某个顶点v0出发,首先访问v0 ;,.依次访问v0各个未被访问的邻接点;,.分别从这些邻接点出发,依次访问它们的各个未被访问的邻接点。访问时应保证:如果vi和vk为当前端结点,且vi在vk之前被访问,则vi的所有未被访问的邻接点应在vk所有未被访问的邻接点之前访问。重复 ,直到所有端结点均没有未被访问的邻接点为止。,类似于树的层次遍历,39,数 据 结 构,7.3 图的遍历,第 7 章 图,例如:,A,B,A,B,D,E,C,G,F,H,I,广 度 优 先 搜 索 树,广度优先搜
17、索,E,D,C,F,G,H,I,需要辅助队列Q,以便实现访问时应保证的一点!,40,数 据 结 构,广度优先搜索,广度优先遍历图g的算法描述,void BFS(int *visited, int v, int *Queue) GraphNode *p;AddQuene(Queue,v); /* 初始顶点入队 */visitedv=1; /* 已访问的顶点 */printf(“%d-“,v); /* 显示 */while(front!=rear) /* 队列不为空 */ v=Delquene(Queue); /* 取出队头元素 */p=Graphv.next; /* 邻接顶点 */while(p
18、!=NULL) /* 有邻接顶点 */ if(visitedp-data=0) /* 没有遍历过 */AddQuene(Queue,p-data); /* v的邻接顶点入队 */visitedp-data=1;printf(“%d-“,p-data); p=p-next; /* 访问下一个邻接顶点 */,41,数 据 结 构,7.3 图的遍历,第 7 章 图,算法思想:,.访问出发点v0 并置访问标志,然后将v0入队;,广度优先搜索,.只要队不空,则重复下述处理:,a.队头结点v出队;,b.对v的所有邻接点w,如果w未被访问,则访问w并置访问标志,然后w入队。,A,1,A,B,D,E,1,1,
19、1,B,D,E,C,1,C,G,1,G,F,1,F,H,1,H,I,1,I,42,数 据 结 构,7.4 最小生成树,第 7 章 图,图的连通性问题,有向无环图的应用,最短路径问题,43,数 据 结 构,7.4 最小生成树,第 7 章 图,可以利用图的遍历来判断一个图是否连通,如果 在遍历的过程中,不止一次调用搜索过程,则说 明该图就是一个非连通图,并且几次调用搜索过 程,表明该图就有几个连通分量。,1.图的连通性问题,无向图的连通分量,A,B,D,C,I,E,F,G,H,J,44,数 据 结 构,7.4 最小生成树,第 7 章 图,有条件的图的遍历过程。,1.图的连通性问题,图中两个顶点之间
20、的简单路径,求从顶点 B 到顶点 K 的一条简单路径。,例如:,从顶点B出发进行深度优先搜索遍历。,A,B,C,D,E,K,H,A,B,E,K,45,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,生成树:,若图G是连通图,从图中某一顶点出发 遍历图时,图中所有的顶点加上遍历 时经过的边所构成的子图称为生成树。,一个连通图的生成树是指一个极小连通子图, 含有图中的全部n个顶点,但只有足以构成一 棵树的n-1条边。,46,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,该问题等价于:,构造网的一棵最小
21、生成树,即:在 e 条带权的边中选取 n-1 条边(不构成回路),使“权值之和”为最小。,假设要在 n 个城市之间建立通讯联络网,则连通 n 个城市只需要修建 n-1条线路,如何在最节省经 费的前提下建立这个通讯网?,47,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,.尽可能选取权值小的边,但不能构成回路。,.选取n-1条恰当的边以连接网的n个顶点。,算法一:克鲁斯卡尔算法( Kruskal ),算法二:普里姆算法 ( Prim ),最小生成树的要解决的两个问题:,48,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,
22、图的生成树与最小生成树,算法一:克鲁斯卡尔算法( Kruskal ),考虑问题的出发点:,为使生成树上边的权值之和达到最小,则 应使生成树中每一条边的权值尽可能地小。,具体做法: 先构造一个只含 n 个顶点的子图 SG, 然后从权值最小的边开始,若它的添加不使SG 中产生回路,则在 SG 上加上这条边,如此重复, 直至加上 n-1 条边为止。,加边法,49,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,算法一:克鲁斯卡尔算法( Kruskal )实例,算法步骤如下; (1)边的权值首先从小到大排序。 (2)从所有的未遍历的边中取出最小权值的边,
23、 记录此遍历并检查是否形成回路。,50,数 据 结 构,1.所有的边按权值从小到大排序,5 (B,C),B,A,E,F,D,C,18,11,6,5,16,6 (B,D),6 (C,D),11 (B,E),14 (D,E),16 (A,B),18 (D,F),19 (A,F),21 (A,E),33 (E,F),2.顶点集合状态:,(B,C),(B,D),(B,E),(A,B),(D,F), A , B , C , D , E , F , B , C , B , C , D , B , C , D, E , B , C , D, E , A , B , C , D, E , A , F,3.最小
24、生成树边的集合:,51,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,算法二:普里姆算法 ( Prim ),基本思想:,取图中任意一个顶点v作为生成树的根,之后往生成树上添加新的顶点w。在添加的顶点w 和已经在生成树上的顶点v之间必定存在一条边,该边的权值在所有连通顶点 v 和 w 之间的边中取值最小。之后继续往生成树上添加顶点,直至生成树上含有 n 个顶点为止。,52,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,算法二:普里姆算法 ( Prim ),一般情况下所添加的顶点应满足条件:,在生成
25、树的构造过程中,图中 n 个顶点分属两个集合:已落在生成树上的顶点集 U 和尚未落在生成树上的顶点集 V-U ; 则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。,基本思想:,加点法,53,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,算法二:普里姆算法 ( Prim ),实例:,a,b,c,d,e,g,f,54,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,算法二:普里姆算法 ( Prim ),算法思想,设N=(V, E)是连通网,TE是N上最小生成树 中边的集合。初始U= u0,
26、 (u0V), TE= , 然后重复执行下述运算:,在所有uU,vV-U的边(u, v)E中,找一 条代价最小的边(u0,v0)并入集合TE,同时v0 并入U,直到U=V,则可生成一棵具有最小代 价的生成树 T=(V, TE)。,55,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,算法二:普里姆算法 ( Prim ),算法思想,连通网用带权的邻接矩阵表示,并设置一个辅助数组 closedge ,数组元素下标对应当前V-U集中的顶点 序号,元素值则记录该顶点和 U集中相连接的代价 最小(最近)边的顶点序号adjvex和权值lowcost。 即对v
27、V-U的每个顶点, closedgev记录所有 与v邻接的、从U到V-U的那组边中的最小边的信息。,56,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,算法二:普里姆算法 ( Prim ),算法思想,57,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,算法二:普里姆算法 ( Prim ),算法思想演示,a,b,c,d,e,g,f,0,1a,19,1a,14,1a,18,0,5e,12,5e,8,5e,16,0,4d,7,4d,3,4d,21,0,3c,5,0,0,0,算法思想演示,58,数 据
28、结 构,.图的生成树不唯一,从不同的顶点出发进行遍历,可以得到不同的生成树;,.即是从相同的顶点出发,在选择最小边时,可能有 多条同样的边可选,此时任选其一。,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,59,数 据 结 构,7.4 最小生成树,第 7 章 图,1.图的连通性问题,图的生成树与最小生成树,O(n2),O(eloge),稠密图,稀疏图,比较两种算法,60,数 据 结 构,7.5 有向无环图及其应用,第 7 章 图,2.有向无环图的应用,带权图的最短路径,从某顶点(源点)出发到另一顶点(目的点)的路径中, 有一条各边(或弧)权值之和最小的路径称为
29、最短路径。,.从单源点到其余各点的最短路径迪杰斯特拉算法(Dijkstra),.每一对顶点之间的最短路径弗洛伊德算法(floyd),61,数 据 结 构,第 7 章 图,2.有向无环图的应用,带权图的最短路径,.从单源点到其余各点的最短路径。,迪杰斯特拉算法(Dijkstra),基本思想:,依最短路径的长度递增的次序求得各条路径。,源点V0,vi,vj,其中,从源点v0到顶点vi的 最短路径是v0到各点最短 路径集合中长度最短者。,7.5 有向无环图及其应用,62,数 据 结 构,第 7 章 图,2.有向无环图的应用,迪杰斯特拉算法(Dijkstra),最短路径 长度 (v0,v2) 10 (
30、v0,v4) 30 (v0,v4,v3) 50 (v0,v4,v3,v5) 60v0v1 ,7.5 有向无环图及其应用,63,数 据 结 构,第 7 章 图,2.有向无环图的应用,迪杰斯特拉算法(Dijkstra),路径长度最短的最短路径的特点:,在这条路径上,必定只含一条弧, 并且这条弧的权值最小。(设为v0 vi),下一条路径长度次短的最短路径的特点:,它只可能有两种情况:或者是直接从源点到该点vj(只含一条弧);或者是从源点经过顶点vi,再到达vj(由两条弧组成)。,7.5 有向无环图及其应用,64,其余最短路径的特点:,再下一条路径长度次短的最短路径特点:,它可能有两种情况:或者是直接
31、从源点到该点 (只含一条弧); 或者是从源点经过顶点vi、 vj再 到达该顶点 (由多条弧组成)。,它或者是直接从源点到该点(只含一条弧); 或者是从源点经过已求得最短路径的顶点,再到达该顶点。,数 据 结 构,第 7 章 图,2.有向无环图的应用,迪杰斯特拉算法(Dijkstra),7.5 有向无环图及其应用,65,数 据 结 构,第 7 章 图,2.有向无环图的应用,迪杰斯特拉算法实现思想,一、存储结构,1. 带权邻接矩阵用g.arcs 表示; 用g.arcsij.adj表示弧上的权。,2. 顶点分为两组:S,V-SS中存放已求得最短路径的终点的集合。,3.辅助一维数组dist若viS ,
32、disti 表示源点到vi的最短路径长度若viV-S,disti表示源点到vi的只包括S中的顶点为中间顶点的最短路径。,初始:S=v0 , v0为源点disti= g.arcs0i.adj ; (viV-S),7.5 有向无环图及其应用,66,数 据 结 构,第 7 章 图,2.有向无环图的应用,迪杰斯特拉算法实现思想,二、最短路径,1、第一条最短路径distk=mindisti |viV-S最短路径(v0,vk),S=S vk,2、修改V-S中顶点的dist值 i V-Sdisti=mindisti,distk+ g.arcski.adj,3、下一条最短路径distj=min disti |
33、 viV-S,4、vj并入集合S,重复2,3,(n-1次)直到v0出发可以到达的所有顶点都包含在S中。,7.5 有向无环图及其应用,67,数 据 结 构,第 7 章 图,2.有向无环图的应用,迪杰斯特拉算法实例,7.5 有向无环图及其应用,68,/,/,/,/,0,2,4,3,5,1,60(V0,V4,V3,V5),/,/,/,0,2,4,3,5,90(V0,V4,V5),/,50(V0,V4,V3),/,0,2,4,3,100(V0,V5),30(V0,V4),60(V0,V2,V3),/,0,2,4,100(V0,V5),30(V0,V4),10(V0,V2),最短路径 长度 (v0, v
34、2) 10,0,0,2,v5,v2,v4,30,10,20,v3,v1,v0,10,(v0, v4) 30,(v0, v4, v3) 50,(v0,v4,v3,v5) 60,v0v1 无,69,数 据 结 构,7.5.1 拓扑排序,第 7 章 图,2.有向无环图的应用,无环的有向图称为有向无环图, 简称 DAG图 (Directed Acyclic Graph),它可以表示一个 工程或系统的流程图。,一项大工程可以分为若干个称为活动的子工程, 用顶点表示; 某些子工程必须在另一些子工程完 成之后才能开始, 用弧表示它们之间的前趋后继 关系; 这样构成的有向图显然是无环的。如何使 工程顺利进行?
35、 完成总工程需要的最短时间? 就 归结为拓扑排序和关键路径问题。,70,数 据 结 构,7.5.1 拓扑排序,第 7 章 图,2.有向无环图的应用,拓扑排序,假设以有向图表示一个工程的施工图或程序的 数据流图, 每个顶点代表一个活动, 弧 表示活动 i 必须先于活动 j 进行, 称为AOV-网(Activity On Vertex), 图中不允许出现回路。,检查有向图中是否存在回路的方法 之一,是对有向图进行拓扑排序。,还可以使用DFS,71,数 据 结 构,7.5.1 拓扑排序,第 7 章 图,2.有向无环图的应用,拓扑排序,何谓“拓扑排序”?,对有向图进行如下操作:,按照有向图给出的次序关
36、系,将图中顶点排成一个 线性序列,对于有向图中没有限定次序关系的顶点, 则可以人为加上任意的次序关系,由此所得顶点的 线性序列称之为拓扑有序序列。显然对于有回路 的有向图得不到拓扑有序序列。,72,数 据 结 构,7.5.1 拓扑排序,第 7 章 图,2.有向无环图的应用,拓扑排序,例如:,可求得拓扑有序序列:,A B C D 或 A C B D,73,数 据 结 构,7.5.1 拓扑排序,第 7 章 图,2.有向无环图的应用,拓扑排序,如何进行拓扑排序?,.从有向图中选取一个没有前驱的顶点,并输出之;,.从有向图中删去此顶点以及所有以它为尾的弧;,重复上述两步,直至图空,或者图 不空但找不到
37、无前驱的顶点为止。,74,数 据 结 构,7.5.1 拓扑排序,第 7 章 图,2.有向无环图的应用,拓扑排序,例如:,C,D,A,G,F,B,H,E,A,C,B,H,G,D,F,E,没有前驱的顶点 入度为零的顶点,删除顶点及它的出弧 弧头顶点的入度-1,75,数 据 结 构,7.5.1 拓扑排序,第 7 章 图,2.有向无环图的应用,拓扑排序,算法实现:,0,0,0,0,0,0,1,1,1,2,1,2,2,3,76,数 据 结 构,7.5.1 拓扑排序,第 7 章 图,2.有向无环图的应用,拓扑排序,算法实现:,链栈:将入度为0的结点进栈,77,数 据 结 构,7.5.2 关键路径,第 7 章 图,从源点到汇点的最长路径长度。这条路径长度最长的路径叫做关键路径(Critical Path),图7-20中的v1-v2-v4-v5-v7就是一条关键路径,长度为6+1+9+2=18,78,(浙江师范大学)图为一个用AOE网表示的工程。试回答: (1)完成此工程,至少需要多少时间? (2)指出关键路径。 (3)哪些活动加速,可以缩短完成工程所需的时间?,解答:(1)至少需要时间为16。 (2)为(V1,V3,V5,V7,V9)。 (3)活动a2,a6,a9,a12加速,可以缩短工程所需的时间。,