1 / 97

第七章 图

第七章 图. 7.1 图的定义和术语 顶点 :表示一个数据元素 边、弧 :两个顶点之间的关系称为 ~ 或 ~ 图 (Graph) : 图 G 是由两个集合 V(G) 和 E(G) 组成的,记为 G=(V,E) 其中: V(G) 是顶点的非空有限集 E(G) 是边的有限集合,边是顶点的无序对或有序对 有向图 :有向图 G 是由两个集合 V(G) 和 E(G) 组成的 其中: V(G) 是顶点的非空有限集 E(G) 是有向边(也称弧)的有限集合,弧是顶点的有序对,记为< v,w> , v,w 是顶点, v 为弧尾, w 为弧头

bairn
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. 第七章 图 • 7.1 图的定义和术语 • 顶点:表示一个数据元素 • 边、弧:两个顶点之间的关系称为~或~ • 图(Graph):图G是由两个集合V(G)和E(G)组成的,记为G=(V,E) 其中:V(G)是顶点的非空有限集 E(G)是边的有限集合,边是顶点的无序对或有序对 • 有向图:有向图G是由两个集合V(G)和E(G)组成的 其中:V(G)是顶点的非空有限集 E(G)是有向边(也称弧)的有限集合,弧是顶点的有序对,记为<v,w>,v,w是顶点,v为弧尾,w为弧头 • 无向图:无向图G是由两个集合V(G)和E(G)组成的 其中:V(G)是顶点的非空有限集 E(G)是边的有限集合,边是顶点的无序对,记为(v,w)或(w,v),并且(v,w)=(w,v)

  2. 2 4 5 1 3 6 G1 例 1 5 7 3 2 4 6 G2 顶点2有三条出边<2,1>、<2,3>、<2,4> 有一条入边<1,2> 顶点3有一个出边邻接点5 有两个入边邻接点2、6 图G1中:V(G1)={1,2,3,4,5,6} E(G1)={<1,2>, <2,1>, <2,3>, <2,4>, <3,5>, <5,6>, <6,3>} 以1为端点的边是(1,2)(1,3) 顶点5的三个邻接点为2、6、7 边(2,4)依附于端点2、4,或者边(2,4)与端点2、4相关联 图G2中:V(G2)={1,2,3,4,5,6,7} E(G1)={(1,2), (1,3), (2,3), (2,4),(2,5), (5,6), (5,7)}

  3. 端点和邻接点——在一个无向图中,若存在一条边(Vi,Vj),则称Vi和Vj为此边的两个端点,并称它们互为邻接点;同时称边(Vi,Vj)依附于端点Vi和Vj,或者说(Vi,Vj)和端点Vi 、Vj相关联 • 出边、入边——在一个有向图中,若存在一条边<vi,vj>,则称此边是顶点vi的一条出边,顶点vj的一条入边;称vi是此边的起点, vj是此边的终点;且vi和vj互为邻接点,并称vj是vi的出边邻接点, vi是vj的入边邻接点 • 顶点的度、入度、出度——无向图中,顶点的度为与每个顶点相连的边数;有向图中,顶点的度分成入度:以该顶点为头的弧的数目与出度:以该顶点为尾的弧的数目,顶点的度等于它的入度与出度之和 • 完全图、稠密图、稀疏图——若无向图中的每两个顶点之间都存在一条边,有向图中的每两个顶点之间都存在着方向相反的两条边,则称此图为完全图。若完全图是无向的,则图中的有n(n-1)/2条边,称为无向完全图;若完全图是有向的,则图中的有n(n-1)条边,称为有向完全图。当一个图接近完全图时,称它为稠密图;当一个图中含有较少的边时(<< n(n-1) ),称它为稀疏图

  4. 子图——如果图G(V,E)和图G’(V’,E’),满足:V’V,E’E,则称G’为G的子图子图——如果图G(V,E)和图G’(V’,E’),满足:V’V,E’E,则称G’为G的子图 • 路径和回路——在一个图G中,从顶点v到顶点v’存在一个序列V={Vi1,Vi2,……Vim},其中v=vi1,v’=vim,且满足(Vij-1,Vij)E 或 <Vij-1,Vij>E,(1<jn),则这个顶点序列为顶点v到顶点v’的一条路经,路径长度指该路径上经过的边的数目。若一条路径上除了前后端点可以相同外,所有端点均不同,则称此路径为简单路径;若一条路径上的前后两端点相同,则被称为回路或环。 • 连通和连通分量——在无向图G中,若从顶点v到顶点v’有路径,则称v和v’是连通的;若图G中任意两个顶点都连通,则称G为连通图,否则称为非连通图。无向图G的极大连通子图称为G的连通分量 • 强连通图和强连通分量——在有向图G中,若从顶点v到顶点v’有路径,则称v和v’是连通的;若图G中任意两个顶点vi和vj都连通,即从vi ~vj和从vj~ vi都存在路径,则称G为强连通图。有向图G的极大连通子图称为G的强连通分量 • 权和网——在一个图中,每条边可以赋予其具有某种含义的数值,此数值称为该边的权,边上带有权值的图叫带权图,或网

  5. 生成树、生成森林——一个连通图的生成树是一个极小连通子图,它包含图中的全部顶点,但只有足以构成一棵树的n(n-1)条边。一个有向图的生成森林由若干棵有向树组成,含有图中的全部顶点,但只有足以构成若干棵不相交的有向树的弧。生成树、生成森林——一个连通图的生成树是一个极小连通子图,它包含图中的全部顶点,但只有足以构成一棵树的n(n-1)条边。一个有向图的生成森林由若干棵有向树组成,含有图中的全部顶点,但只有足以构成若干棵不相交的有向树的弧。

  6. 例 2 4 5 无向完全图 有向完全图 1 3 6 G1 2 2 1 3 1 3 例 1 5 7 3 2 4 6 G2 顶点5的度:3 顶点2的度:4 顶点2入度:1 出度:3 度为:4 顶点4入度:1 出度:0 度为:1

  7. 例 2 2 4 4 5 5 1 1 3 3 6 6 G1 例 1 5 7 图与子图 3 2 4 6 G2 5 3 6 路径:1,2,3,5,6,3 路径长度:5 简单路径:1,2,3,5 回路:1,2,3,5,6,3,1 简单回路:3,5,6,3 路径:1,2,5,7,6,5,2,3 路径长度:7 简单路径:1,2,5,7,6 回路:1,2,5,7,6,5,2,1 简单回路:1,2,3,1

  8. 2 4 5 1 3 6 例 例 2 4 5 5 1 3 6 3 6 连通图 强连通图 非连通图 连通分量

  9.            1 2 例  1 2  3 4 3  G1  4 5 G2    7.2 图的存储结构 • 邻接矩阵——表示顶点间相邻关系的矩阵 • 定义:设G=(V,E)是有n1个顶点的图,G的邻接矩阵A是具有以下性质的n阶方阵

  10. 特点: • 无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2 • 有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n² • 无向图中顶点Vi的度TD(Vi)是邻接矩阵A中第i行元素之和 • 有向图中, • 顶点Vi的出度是A中第i行元素之和 • 顶点Vi的入度是A中第i列元素之和 • 网的邻接矩阵可定义为:

  11. 5 例 1 2 3     8 7 4 5 1 6 3 4 2      

  12. 表结点: typedef struct ArcNode { int adjvex; //邻接点域,存放与Vi邻接的点在表头数组中的位置 struct ArcNode *nextarc; //链域,指示下一条边或弧 }ArcNode; adjvex nextarc 头结点: typedef struct VNode { vertextype data; //存放顶点信息 ArcNode *firstarc; //指示第一个邻接点 }Vnode,AdjList[MAX_VERTEX_NUM]; data firstarc • 邻接表 顺序存储和链式存储相结合的方法。顺序存储部分保存图中顶点的信息;链式存储部分保存图中边或弧的信息 • 实现:为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧) 邻接表存储结构:typedef struct{ AdjList vertices;//表头向量 int vernum,arcnum;//顶点数和弧数 int kind; //图的种类标志 }ALGraph;

  13. data firstarc adjvex nextarc 1 例 ^ 2 a ^ 3 b ^ 4 c ^ d 5 2 1 2 3 4 3 2 4 1 4 2 3 1 3 5 a b 例 data firstarc adjvex nextarc a b 1 a ^ c d c ^ b 2 G1 3 c ^ d e G2 4 d ^ 5 e ^

  14. a b c d 3 1 1 4 a b data adjvex firstarc nextarc 1 ^ c d 2 ^ G1 3 ^ 4 ^ • 特点 • 无向图中顶点Vi的度为第i个单链表中的结点数 • 有向图中 • 顶点Vi的出度为第i个单链表中的结点个数 • 顶点Vi的入度为整个单链表中邻接点域值是i的结点个数 • 逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表

  15. 弧结点: typedef struct ArcBox { int tailvex, headvex; //弧尾、弧头在表头数组中位置 struct ArcBox *hlink;//指向弧头相同的下一条弧 struct ArcBox *tlink; //指向弧尾相同的下一条弧 } ArcBox; tailvex headvex hlink tlink 顶点结点: typedef struct VexNode { VertexType data; //存与顶点有关信息 ArcBox *firstin;//指向以该顶点为弧头的第一个弧结点 ArcBox *firstout; //指向以该顶点为弧尾的第一个弧结点 }VexNode; data firstin firstout • 有向图的十字链表表示法 十字链表结构:typedef struct{ VexNode xlist[MAX]; int vexnum,arcnum; }

  16. 1 2 1 3 1 a b 2 a b 3 c c d 3 1 3 4 d 4 4 3 4 1 4 2 ^ ^ ^ ^ ^ ^ ^ ^

  17. 边结点: typedef struct EBox { VisitIf mark; //标志域 int ivex, jvex; //该边依附的两个顶点在表头数组中位置 struct EBox *ilink, *jlink; //分别指向依附于ivex和jvex的下一条边 }EBox; mark ivex ilink jvex jlink 顶点结点: typedef struct VexBox { VertexType data; //存放与顶点有关的信息 EBox *firstedge; //指向第一条依附于该顶点的边 }VexBox; data firstedge • 无向图的邻接多重表表示法 邻接多重表: typedef struct { VexBox adjmulist[MAX]; int vexnum,edgnum; }

  18. 5 2 3 5 3 2 3 4 1 4 1 2 1 a 例 b 2 a b 3 c c 4 d d e 5 e ^ ^ ^ ^ ^

  19. V1 例 V2 V3 V4 V5 V6 V7 V8 • 7.3 图的遍历 从图中任一顶点出发,对图中所有顶点访问且只访问一次的过程。 • 深度优先搜索遍历(DFS) • 方法:从图的某一顶点V0出发,访问此顶点,并将其标记为已访问过;然后依次从V0的未被访问的邻接点出发,深度优先遍历图,直至图中所有和V0相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止 深度遍历:V1 V2 V4  V8 V5 V3 V6 V7

  20. V1 例 V1 例 V2 V3 V2 V3 V4 V5 V6 V7 V4 V5 V6 V7 V8 V8 深度遍历:V1 V2 V4  V8 V5 V6 V3 V7 深度遍历:V1 V2 V4  V8 V3 V6 V7 V5

  21. 开始 置标志并访问V 开始 求V的邻接点 标志数组初始化 有邻接点w N V=0 Y 结束 V访问过 Y W访问过 N DFS N Y 求下一邻接点 wV V=V+1 V<Vexnums DFS Y N 结束 • 深度优先搜索遍历算法 • 递归算法

  22. data firstarc adjvex nextarc 1 1 ^ ^ 2 2 3 3 ^ 5 3 6 3 7 2 8 2 3 6 7 5 1 4 8 2 1 4 4 4 ^ V1 例 5 5 ^ V2 V3 6 6 ^ 7 7 V4 V5 V6 V7 ^ 8 8 ^ V8 深度遍历:V1 V3  V7  V6  V2  V5  V8  V4

  23. V1 例 V2 V3 V4 V5 V6 V7 data V8 firstarc adjvex nextarc 1 1 ^ 2 2 ^ 6 7 2 7 3 2 8 8 4 3 3 ^ 4 4 ^ 5 5 ^ 6 6 ^ 7 7 ^ 8 8 ^ 深度遍历:V1 V3  V7  V6  V2  V4  V8  V5

  24. V1 例 V2 V3 V4 V5 V6 V7 V8 • 广度优先搜索遍历(BFS) • 方法:从图的某一顶点V0出发,访问此顶点后,将其标记为已访问过。再依次访问V0的各个未曾访问过的邻接点;然后分别从这些邻接点出发,广度优先遍历图,直至图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止 广度遍历:V1 V2 V3  V4 V5 V6 V7 V8

  25. V1 例 V1 例 V2 V3 V2 V3 V4 V5 V6 V7 V4 V5 V6 V7 V8 V8 广度遍历:V1 V2 V3  V4 V5 V6 V7 V8 广度遍历:V1 V2 V3  V4 V6 V7 V8 V5

  26. 开始 标志数组初始化 V=0 V访问过 N BFS Y V=V+1 V<Vexnums Y N 结束 • 广度优先遍历算法

  27. 开始 BFS 初始化队列 访问v置标志 v入队 Y 队列空吗 a N 访问w,置标志 队头u出队 结束 求u邻接点w w入队 N w存在吗 u的下一邻接点w Y Y w访问过 N a

  28. 1 2 3 4 5 f f f data firstarc 5 4 5 3 4 5 2 1 1 3 2 1 adjvex nextarc ^ 1 1 1 4 2 2 4 3 ^ 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 3 3 ^ r r r 4 4 ^ 遍历序列:1 遍历序列:1 4 遍历序列:1 4 3 5 5 ^

  29. 1 4 3 2 3 2 2 3 4 5 遍历序列:1 4 3 2 遍历序列:1 4 3 2 f f f data firstarc 3 1 1 4 3 5 5 5 1 2 2 4 adjvex nextarc ^ 1 1 2 2 3 2 5 ^ 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 3 3 ^ r r r 4 4 ^ 遍历序列:1 4 3 2 5 5 5 ^

  30. 1 2 3 4 5 f f f data firstarc 1 5 3 4 1 5 2 2 3 4 5 1 adjvex nextarc ^ 1 1 2 2 ^ 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 5 2 5 3 3 ^ r r r 4 4 ^ 5 5 ^ 遍历序列:1 4 3 2 5 遍历序列:1 4 3 2 5 遍历序列:1 4 3 2 5

  31. A B C D E F G H I K J L M 7.4 图的连通性问题 • 无向图的连通分量和生成树 深度优先遍历搜索时三次调用DFS,得到的顶点序列为: ALMBJFC DE GKHI 这三个顶点集再加上依附于它们的边,便构成该非连通图的三个连通分量 设E(G)为连通图G的边集, V(G)为G的顶点集。从图中任一顶点出发遍历图时, E(G)被分为两部分:遍历过程中经过的边集T(G)和遍历中没有经过的边集B(G)(即E(G) - T(G) )。则T(G)和V(G)构成了连通图G的极小连通子图,即连通图的一棵生成树。

  32. G K I H • 生成树 • 深度优先生成树与广度优先生成树 • 定义:所有顶点均由边连接在一起,但不存在回路的图叫~ • 生成森林:非连通图每个连通分量的生成树一起组成非连通图的~ • 说明 • 一个图可以有许多棵不同的生成树 • 所有生成树具有以下共同特点: • 生成树的顶点个数与图的顶点个数相同 • 生成树是图的极小连通子图 • 一个有n个顶点的连通图的生成树有n-1条边 • 生成树中任意两个顶点间的路径是唯一的 • 在生成树中再加一条边必然形成回路 • 含n个顶点n-1条边的图不一定是生成树

  33. V1 V1 V2 V3 V2 V3 V4 V5 V6 V7 V4 V5 V6 V7 V1 V8 V1 V8 V2 V3 V2 V3 V4 V6 V4 V5 V6 V7 V1 例 V8 V7 V2 V3 V8 广度优先生成树 V5 V4 V5 V6 V7 深度优先生成树 V8 深度遍历:V1 V2 V4  V8 V5 V3 V6 V7 广度遍历:V1 V2 V3  V4 V5 V6 V7 V8

  34. A B C D E F G H D A I K L C F E J M L M B J G K I 深度优先生成森林 H

  35. 7 1 2 7 5 9 13 24 6 5 10 17 12 3 4 18 要在n个城市间建立通信联络网, 顶点——表示城市 边的权——城市间建立通信线路所需花费代价 希望找到一棵生成树,它的每条边上的权值之和(即建立 该通信网所需花费的总代价)最小———最小代价生成树 最小生成树:如果无向连通图是一个网,那么它的所有生成树中必有一棵边的权值总和最小的生成树,称为最小代价生成树,简称最小生成树 • 最小生成树 • 问题提出 MST性质:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u ∈ U ,v ∈ V-U,则必存在一棵包含边(u,v)的最小生成树 一个图的最小生成树不是唯一的

  36. 构造最小生成树方法 • 方法一:普里姆(Prim)算法 • 算法思想:设N=(V,{E})是具有n个顶点的连通网,T=(U, TE) 是N的最小生成树: • 1)初始令U={u0},(u0V), TE= • 2)在所有uU,vV-U的边(u,v)E中,找一条代价最小的边(u0,v0) • 3)将(u0,v0)并入集合TE,同时v0并入U • 4)重复上述2)、3)步操作直至U=V为止,此时TE中含有n-1条边,且T=(V,{TE})即为N的最小生成树 • 算法实现:图的存储结构用邻接矩阵表示。辅助数组 closedge记录从U到V-U权值最小的边,数组元素具有两个域: lowcost:保存集合中V-U各顶点与集合U中各顶点构成的所有边中具有最小权值边的权值; adjvex:保存依附于该边的在集合U中的顶点 因为边的权值不会为0,故若有closedge[i].lowcost=0,则表示顶点vi已并入到集合U中

  37. 1 1 例 5 6 1 1 5 2 4 5 5 3 3 3 3 2 4 6 6 5 6 1 1 1 1 1 1 2 4 4 1 1 2 4 3 5 3 3 2 2 3 4 2 4 4 4 5 6 6 6 6 1

  38. 0 1 2 3 4 5 0 1 2 3 4 5 1 1 例 5 5 6 6 1 1 5 2 2 4 4 5 5 5 5 3 3 3 3 3 2 2 4 4 6 6 6 6 5 5 6 6 1 1 2 4 3 2 4 5 6

  39. Prim算法的时间复杂度分析 第一个for循环对辅助数组进行初始化,其语句频度为n,第二个for循环的语句频度为n-1,其中又包含了两个内层循环:一是确定k值,其语句频度为n-1,二是重新选择最小代价的边,其语句频度为n,因此,prim算法的时间复杂度为O(n2)。 Prim算法中只与网的顶点数有关,而与其边数无关,因此适合于求边稠密的网的最小生成树。

  40. 1 例 5 1 6 1 2 4 1 5 5 2 4 5 3 3 3 2 4 2 6 3 4 6 5 6 5 6 • 方法二:克鲁斯卡尔(Kruskal)算法 • 算法思想:设连通网N=(V,E),T=(U,TE)是最小生成树 • 初始状态为只有n个顶点而无边的非连通图T=(V,{}),即U=V,TE={} • 在E中选取代价最小的边,若选取的边在T中不形成回路,则将此边加入到TE中;否则,舍去此边,选取下一条代价最小的边,依此类推,直至TE中含有n-1条边,且U中所有顶点都在同一连通分量上为止,此时T即为最小生成树。

  41. 7.5有向无环图及其应用 有向无环图:一个无环的有向图,简称DAG图。DAG图是描述含有公共子式的表达式及工程或系统的进行过程时的有效工具。 活动:一个较大的工程被划分成许多子工程,这些子工程被称作活动。 • 拓扑排序 • 问题提出:学生选修课程问题 顶点——表示课程 有向弧——表示先决条件,若课程i是j的先决条件,则图中有弧<i,j> 学生应按怎样的顺序学习这些课程,才能无矛盾、顺利地完成学业——拓扑排序 • 定义 • AOV网——用顶点表示活动,用弧表示活动间优先关系的有向图称为顶点表示活动的网(Activity On Vertex network),简称AOV网 • 若<vi,vj>是图中有向边,则vi是vj的直接前驱;vj是vi的直接后继 • AOV网中不允许有回路,这意味着某项活动以自己为先决条件

  42. 拓扑排序——把AOV网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程叫~拓扑排序——把AOV网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程叫~ • 检测AOV网中是否存在环方法:对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环 • 拓扑排序的方法 • 在有向图中选一个没有前驱的顶点且输出之 • 从图中删除该顶点和所有以它为尾的弧 • 重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止

  43. C4 C5 课程代号 课程名称 先修棵 例 程序设计基础 离散数学 数据结构 汇编语言 语言的设计和分析 计算机原理 编译原理 操作系统 高等数学 线性代数 普通物理 数值分析 无 C1 C1,C2 C1 C3,C4 C11 C3.C5 C3,C6 无 C9 C9 C1,C9,C10 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C2 C1 C3 C7 C12 C8 C10 C9 C6 C11

  44. C4 C5 C2 C1 C3 C7 C12 C8 C10 C9 C6 C11 拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12--C8 或 :C9--C10--C11--C6--C1--C12--C4--C2--C3--C5--C7--C8 一个AOV网的拓扑序列不是唯一的

  45. C4 C5 C2 C1 C3 C7 C12 C8 C10 C9 C6 C11

  46. C4 C5 C4 C5 C2 C3 C3 C7 C7 C12 C12 C8 C8 C10 C10 C9 C9 C6 C6 C11 C11 拓扑序列:C1 拓扑序列:C1--C2 (1) (2)

  47. C4 C5 C5 C7 C7 C12 C12 C8 C8 C10 C9 C10 C6 C9 C6 C11 C11 拓扑序列:C1--C2--C3 拓扑序列:C1--C2--C3--C4 (3) (4)

  48. C12 C8 C7 C10 C9 C6 C12 C8 C11 (6) (5) C10 C9 C6 C12 拓扑序列:C1--C2--C3--C4--C5--C7 C8 C12 C8 C11 C6 拓扑序列:C1--C2--C3--C4--C5 C10 C6 C11 C11 拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10 拓扑序列:C1--C2--C3--C4--C5--C7--C9 (8)

  49. C12 C8 C6 (9) (10) 拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11 C12 C8 C8 拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11--C6--C12--C8 (11) 拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11--C6 拓扑序列:C1--C2--C3--C4--C5--C7--C9 --C10--C11--C6--C12 (12)

  50. 算法实现 • 以邻接表作存储结构 • 设置一个包含n个元素的一维数组indegree,保存AOV网中每个顶点的入度值。 • 把邻接表中所有入度为0的顶点进栈 • 栈非空时,输出栈顶元素Vj并退栈;在邻接表中查找Vj的直接后继Vk,把Vk的入度减1,即indegree[k]-1;若Vk的入度为0则进栈 • 重复上述操作直至栈空为止。若栈空时输出的顶点个数不是n,则有向图有环;否则,拓扑排序完毕

More Related