收藏 分享(赏)

数据结构讲义7.ppt

上传人:czsj190 文档编号:9258114 上传时间:2019-07-31 格式:PPT 页数:85 大小:1.09MB
下载 相关 举报
数据结构讲义7.ppt_第1页
第1页 / 共85页
数据结构讲义7.ppt_第2页
第2页 / 共85页
数据结构讲义7.ppt_第3页
第3页 / 共85页
数据结构讲义7.ppt_第4页
第4页 / 共85页
数据结构讲义7.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

1、7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 最短路径,第七章 图,1,图定义 图是由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构:Graph( V, E ) 其中 V = x | x 某个数据对象 是顶点的有穷非空集合;E = (x, y) | x, y V 或 E = | x, y V & Path (x, y) 是顶点之间关系的有穷集合,也叫做边(edge)集合。Path (x, y ) 表示从 x 到 y 的一条单向通路, 它是有方向的。 有向图与无向图 在有向图中,顶点对是有序的。在无向图中,顶点对(x, y)是无序的

2、。,7.1 图的定义和术语,2,A,B,C,D,A,B,C,D,E,有向图 G1,无向图 G2,顶点:,有向边(弧)、弧尾或初始结点、弧头或终止结点,A,B,A,B,有向图:G1 =(V1,A1) V1 = A,B,C,D A1 = , , , ,顶点:,无向边或边,A,B,无向图:G2 =(V2,A2) V2 = A,B,C,D,E A2 =(A,B), (A,C),(B,D), (B,E),(C,E),(D,E),A,B,3,7.1 图的定义和术语,完全图 若有 n 个顶点的无向图有 n(n-1)/2 条边, 则此图为完全无向图。有 n 个顶点的有向图有n(n-1) 条边, 则此图为完全有

3、向图。 权 某些图的边具有与它相关的数, 称之为权。带权图叫做网。,4,7.1 图的定义和术语,邻接顶点 如果 (u, v) 是 E(G) 中的一条边,则称 u , v 互为邻接顶点。 顶点的度 顶点v的度是与它相关联的边的条数。记作TD(v)。在有向图中,顶点v的入度是以v为终点的有向边的条数, 记作 ID(v); 顶点v的出度是以 v 为始点的有向边的条数, 记作OD(v)。,5,A,B,C,D,有向图 G1,A,B,C,D,E,无向图 G2,ID(A)=1; OD(A)=2; ID(B)=1; OD(B)=0; ,TD(A)=2; TD(B)=3; TD(C)=2; TD(D)=2; T

4、D(E)=3,7.1 图的定义和术语,子图 设有两个图 G(V, E) 和 G(V, E)。若 V V 且 EE, 则称 图G 是图G 的子图。,6,7.1 图的定义和术语,路径 在图 G(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点 vp1, vp2, , vpm,到达顶点vj。则称顶点序列 ( vi vp1 vp2 . vpm vj ) 为从顶点vi 到顶点 vj 的路径。它经过的边(vi, vp1)、(vp1, vp2)、.、(vpm, vj)应是属于E的边。 简单路径 若路径上各顶点 v1,v2,.,vm 均不互相重复, 则称这样的路径为简单路径。,7,7.1 图的定

5、义和术语,回路 若路径上第一个顶点 v1 与最后一个顶点vm 重合, 则称这样的路径为回路或环。 路径长度 非带权图的路径长度是指此路径上边的条数。 带权图的路径长度是指路径上各边的权之和。,8,7.1 图的定义和术语,连通图与连通分量 在无向图中, 若从顶点v1到顶点v2有路径, 则称顶点v1与v2是连通的。如果图中任意一对顶点都是连通的, 则称此图是连通图。非连通图的极大连通子图叫做连通分量。,A,B,C,D,E,F,G,I,J,L,H,M,K,A,B,C,D,E,H,M,F,G,I,J,L,K,无向图G,无向图G的三个连通分量,9,7.1 图的定义和术语,强连通图与强连通分量 在有向图中

6、, 若对于每一对顶点vi和vj, 都存在一条从vi到vj和从vj到vi的路径, 则称此图是强连通图。非强连通图的极大强连通子图叫做强连通分量。,有向图G,有向图G的两个强连通分量,A,B,C,D,A,B,C,D,10,7.1 图的定义和术语,生成树 一个连通图的生成树是它的极小连通子图,包含连通图的全部n个顶点,但只有构成一棵树的n-1条边。,A,B,C,D,E,H,M,A,B,C,D,E,H,M,无向图G,无向图G的生成树,11,7.1 图的定义和术语,CreatGraph( / 按定义(V, VR) 构造图,DestroyGraph( / 销毁图,结构的建立和销毁,图的基本操作,对顶点的访

7、问操作,LocateVex(G, u); / 若G中存在顶点u,则返回该顶点在/ 图中“位置”;否则返回其它信息。,GetVex(G, v); / 返回 v 的值。,PutVex( / 对 v 赋值value。,12,7.1 图的定义和术语,FirstAdjVex(G, v); / 返回 v 的“第一个邻接点”。若该 / 顶点在 G 中没有邻接点,则返回空。,NextAdjVex(G, v, w); / 返回 v 相对于 w 的“下一 个邻/ 接点”。若 w 是 v 的最后一个邻接点,则返回“空”。,对邻接点的操作,InsertVex( /在图G中增添新顶点v。,DeleteVex( / 删除

8、G中顶点v及其相关的弧。,插入或删除顶点,13,7.1 图的定义和术语,InsertArc( / 在G中增添弧,DeleteArc( /在G中删除弧,插入和删除弧,DFSTraverse(G, v, Visit(); / 从顶点v起深度优先遍历图G,并对每个顶点调用函数 / Visit一次且仅一次。,BFSTraverse(G, v, Visit(); / 从顶点v起广度优先遍历图G,并对每个顶点调用函数 / Visit一次且仅一次。,遍历,14,7.1 图的定义和术语,7.2 图的存储结构,在图的邻接矩阵表示中,有一个记录各个顶点信息的顶点表,还有一个表示各个顶点之间关系的邻接矩阵。 设图

9、A = (V, E)是一个有 n 个顶点的图,则图的邻接矩阵是一个二维数组 A.edgenn,定义:i,j表示存放在顶点表中第i个和第j个顶点。 无向图的邻接矩阵是对称的,有向图的邻接矩阵可能是不对称的。,7.2.1 邻接矩阵 (Adjacency Matrix),15,16,7.2 图的存储结构,网的邻接矩阵,17,7.2 图的存储结构,#define MAX 20 typedef enum DG, DN, AG, AN GraphKind; typedef structVertexType vexsMAX; /顶点数组int EdgeMAXMAX; /邻接矩阵int vexnum; /顶点

10、数int arcnum; /边数GraphKind kind; /图的类型 Mgraph;,用邻接矩阵表示图时,除了存储用于表示顶点间相邻关系的邻接矩阵外,还需要一个数组存储顶点。表示形式为:,18,7.2 图的存储结构,2,1,4,3,5,19,7.2 图的存储结构,B,A,D,C,E,20,7.2 图的存储结构,2,1,5,3,4,6,20,30,50,40,70,80,21,7.2 图的存储结构,7.2.2 邻接表 (Adjacency List),无向图的邻接表:把同一个顶点发出的边链接在同一个边链表中,链表的每一个结点代表一条边,叫做边结点,边结点中保存有与该边相关联的另一顶点的顶点

11、下标 adjvex 和指向同一链表中下一个边结点的指针 nextarc。 顶点表:用数组的形式存放所有的顶点及对应的边链表的头指针。 边链表:每条边用一个结点进行表示。同一个结点的所有的边形成它的边结点单链表。 在邻接表的边链表中,各个边结点的链接顺序任意,视边结点输入次序而定。,22,7.2 图的存储结构,VNode,ArcNode,data,firstarc,adjvex,nextarc,顶点数组,边链表,23,7.2 图的存储结构,有向图可以建立邻接表和逆邻接表:1)在有向图的邻接表中,第 i 个边链表链接的边都是顶点 i 发出的边。也叫做出边表。2)在有向图的逆邻接表中,第 i 个边链

12、表链接的边都是进入顶点 i 的边。也叫做入边表。,24,7.2 图的存储结构,typedef struct ArcNodeint adjvex;struct ArcNode *nextarc; ArcNode; / 边结点类型 typedef struct VNodeVertexType data;ArcNode *fistarc; Vnode; / 顶点结点类型 typedef structVnode verticesMAX; /顶点数组int vexnum,arcnum; /顶点数和边数GraphKind kind; /图的类型 ALGraph;,邻接表的表示形式:,25,7.2 图的存储

13、结构,void CreateALGraph(ALGraph / 插入到顶点j的边链表,26,7.2 图的存储结构,7.3 图的遍历,从图中某一顶点出发,沿着一些边访问图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历 ( Graph Traversal )。 图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。 为了避免重复访问,可设置一个标志顶点是否被访问过的辅助数组 visited 1n ,它的初始状态为 FALSE,在图的遍历过程中,一旦某一个顶点 i 被访问,就立即让 visited i 为 TRUE,防止它被多次访

14、问。 常用的遍历方法有深度优先搜索(DFS)和广度优先搜索(BFS)。,27,A,深度优先搜索(连通图):,7.3.1 深度优先搜索,遍历序列: A,B,E,G,C,F,D,H,I,28,B,E,G,C,F,D,H,I,7.3 图的遍历,A,B,C,D,E,F,G,I,J,L,H,M,K,深度优先搜索(非连通图):,遍历序列: A,B,D,C,M,E,H, F,G,I,J,L,K,29,A,B,E,G,C,F,D,H,I,M,J,L,K,7.3 图的遍历,总结:DFS 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;再从 w1 出发,访问与 w1邻 接但还没有访问过的

15、顶点 w2;然后再从 w2 出发,进行类似的访问, 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。,30,7.3 图的遍历,深度优先搜索的实现,变量说明:Boolean visitedMAX ; /用于标识结点是否已被访问过,void DFSTraverse( Graph G ) for ( k=1; k=G.vexnum; +k ) visitedk =

16、 FALSE;for ( k=1; k=G.vexnum; +k )if ( !visited k ) DFS(G, k); void DFS( Graph G, int v ); visitedv = TRUE; VISIT( v ); / 访问图G中第v个顶点for (w=FirstAdjVex(G, v); w; w=NextAdjVex(G, v, w) if ( !visited w ) DFS(G, w);,31,7.3 图的遍历,int FirstAdjVex(ALGraph G, int v) / 返回G中第v个顶点的第1个邻接点的序号。如果v无邻接点,返回0。if(!G.ve

17、rticesv.firstarc) return(0);else return(G.verticesv.firstarc-adjvex); ,32,7.3 图的遍历,int NextAdjVex(ALGraph G, int v, int w) / 返回G中第v个顶点的相对于顶点w的下一个邻接点的序号。如果v无相对于顶点w的下一个邻接点,返回0。 ArcNode *p;p=G.vetricesv.firstarc;while( p ,33,7.3 图的遍历,7.3.2 广度优先搜索,广度优先搜索(连通图):,遍历序列: A,B,C,D,E,F,G,H,I,34,A,B,E,G,C,F,D,H,

18、I,7.3 图的遍历,A,B,C,D,E,F,G,I,J,L,H,M,K,广度优先搜索(非连通图):,遍历序列:A,B,C,E,H,D,M, F,G, I,J,K,L,35,A,B,E,G,C,F,D,H,I,M,J,L,K,7.3 图的遍历,总结: 广度优先搜索在访问了起始顶点 v 之后,由 v 出发,依次访问 v 的各个未被访问过的邻接顶点 w1, w2, , wt,然后再顺序访问 w1, w2, , wt 的所有还未被访问过的邻接顶点。再从这些访问过的顶点出发,访问它们的所有未被访问过的邻接顶点, 如此做下去,直到图中所有顶点都被访问到为止。 广度优先搜索是一种分层的搜索过程,每向前走一

19、步可能访问一批顶点,不像深度优先搜索有往回退的情况。因此,广度优先搜索不是一个递归的过程,其算法也不是递归的。 为了实现逐层访问,算法中使用了一个队列,以记忆正在访问的这一层和上一层的顶点,以便于向下一层访问。,36,7.3 图的遍历,void BFSTraverse( Graph G ) for ( v=1; v=G.vexnum; +v ) visitedv = FALSE;InitQueue(Q);for( v=1; v=G.vexnum; +v )if ( !visitedv ) visitedv=TRUE; VISIT(v); EnQueue(Q, v);while (!EmptyQ

20、ueue(Q) DeQueue(Q,u); for(w=FirstAdjVex(G, u); w; w=NextAdjVex(G, u, w)if( !visitedw ) visitedw=TRUE; VISIT(w); EnQueue(Q, w); / end while / end if ,广度优先搜索的实现,变量说明:Boolean visitedMAX ; /用于标识结点是否已被访问过,37,7.4 图的连通性问题,A,B,C,D,E,F,G,I,J,L,H,M,K,A,B,C,D,E,H,M,F,G,I,J,L,K,无向图G的三个连通分量,无向图G,连通:顶点v至v之间有路径存在。

21、 连通图:无向图G的任意两点之间都是连通的,则称G是连通图。 连通分量:极大连通子图。,7.4.1 无向图的连通分量和生成树,38,生成树:极小连通子图。包含图的所有 n 个结点,但只含图的 n-1 条边。在生成树中添加一条边之后,必定会形成回路或环。 生成森林:非连通图的每个连通分量都可以构造一棵生成树,这些生成树组成了非连通图的生成森林。,A,B,C,D,E,F,G,I,J,L,H,M,K,A,B,C,D,E,H,M,F,G,I,J,L,K,无向图G的生成森林,无向图G,39,7.4 图的连通性问题,最小代价生成树:对于网络,其生成树中的边也带权,将生成树各边的权值总和称为生成树的权,并把

22、权值最小的生成树称为最小生成树(Minimum Spanning Tree) 。实例:,7.4.2 最小代价生成树,40,7.4 图的连通性问题,MST 性质:假设 G = V, E 是一个连通网,U 是顶点集合 V 的一个非空子集。若 ( u, v ) 是一条权值最小的边,且 u 属于 U , v 属于 V - U,则必存在一棵包括边 ( u, v ) 在内的最小代价生成树。,7.4 图的连通性问题,证明:假定存在一棵不包括边 ( u, v ) 在内的最小代价生成树,设其为 T。将边( u, v ) 添加到树 T ,则形成一条包含 ( u, v ) 的回路。因此,必定存在另一 条边 ( u,

23、v ) ,且 u 属于 U , v属于 V - U。删去边 ( u,v ) ,得到另一棵生成 树 T; 因为边 ( u, v ) 的代价小于边( u,v ) 的代价,所以新的生成树T将是代价最小的树。和原假设矛盾。,(a)最小生成树T,(b)加入边(v1,v3),(c)最小生成树T,42,7.4 图的连通性问题,基本思想:从连通网 N = V, E 中的某一顶点 u0 出发,选择与它关联的具有最小权值的边(u0, v)加入集合T,将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v)加入集合T,把它的顶点加入到集合U中。如此继

24、续下去,直到网中的所有顶点都加入到生成树顶点集合U中为止。此时,最小生成树=U,T。,1 Prim算法,43,7.4 图的连通性问题,Prim 算法的基本描述设G(V,E)是个带权无向连通图,U是最小生成树的顶点集合,T是最小生成树的边集合: 从G中任选uV;Uu; T = ; while ( U != V ) 在uU, vV-U中找一条权值最小的边(u,v);U = U + v;T = T + (u,v);,44,7.4 图的连通性问题,Prim 算法的实例,v1,v2,v4,v3,v5,v6,6,1,6,5,5,5,6,3,4,2,辅助数组closedge的定义: struct Verte

25、xType adjvex;VRType lowcost; closedge MAX ;,对于每个viV-U:closedge i.lowcost = Min cost(u,vi) | uU ,表示vi与U中顶点之间存在的一条权值最小的边的权值;closedgei.adjvex表示U中与vi之间存在权值最小的边的顶点的序号。,45,7.4 图的连通性问题,adjvex,lowcost,1 2 3 4 5 6,Prim 算法的实例,closedge ,(1)选择v1加入U,设置closedge数组;U: v1T: ,46,7.4 图的连通性问题,v1,v2,v4,v3,v5,v6,6,1,6,5,

26、5,5,6,3,4,2,1 2 3 4 5 6,closedge ,adjvex,lowcost,(2)选择v3加入U,(v1,v3) 加入T;U: v1, v3T: (v1,v3),47,7.4 图的连通性问题,v1,v2,v4,v3,v5,v6,6,1,6,5,5,5,6,3,4,2,5,5,6,4,1 2 3 4 5 6,closedge ,adjvex,lowcost,(3)调整closedge数组;U: v1, v3T: (v1,v3),48,7.4 图的连通性问题,v1,v2,v4,v3,v5,v6,6,1,6,5,5,5,6,3,4,2,1 2 3 4 5 6,closedge

27、,adjvex,lowcost,(4)选择v6加入U,(v3,v6) 加入T;U: v1, v3, v6T: (v1,v3),(v3,v6),49,7.4 图的连通性问题,v1,v2,v4,v3,v5,v6,6,1,6,5,5,5,6,3,4,2,5,2,6,1 2 3 4 5 6,closedge ,adjvex,lowcost,(5)调整closedge数组;U: v1, v3, v6T: (v1,v3),(v3,v6),50,7.4 图的连通性问题,v1,v2,v4,v3,v5,v6,6,1,6,5,5,5,6,3,4,2,1 2 3 4 5 6,closedge ,adjvex,low

28、cost,(6)选择v4加入U,(v6,v4) 加入T;U: v1, v3, v6, v4T: (v1,v3),(v3,v6),(v6,v4),51,7.4 图的连通性问题,v1,v2,v4,v3,v5,v6,6,1,6,5,5,5,6,3,4,2,5,6,1 2 3 4 5 6,closedge ,adjvex,lowcost,(7)调整closedge数组;U: v1, v3, v6, v4T: (v1,v3),(v3,v6),(v6,v4),52,7.4 图的连通性问题,v1,v2,v4,v3,v5,v6,6,1,6,5,5,5,6,3,4,2,closedge ,1 2 3 4 5 6

29、,adjvex,lowcost,(8)选择v2加入U,(v3,v2) 加入T;U: v1, v3, v6, v4, v2T: (v1,v3),(v3,v6),(v6,v4),(v3,v2),53,7.4 图的连通性问题,v1,v2,v4,v3,v5,v6,6,1,6,5,5,5,6,3,4,2,3,closedge ,adjvex,lowcost,1 2 3 4 5 6,(9)调整closedge数组;U: v1, v3, v6, v4, v2T: (v1,v3),(v3,v6),(v6,v4),(v3,v2),54,7.4 图的连通性问题,v1,v2,v4,v3,v5,v6,6,1,6,5,

30、5,5,6,3,4,2,closedge ,adjvex,lowcost,1 2 3 4 5 6,(10)v5加入U,(v2,v5)加入T,结束;U: v1, v3, v6, v4, v2, v5T: (v1,v3),(v3,v6),(v6,v4),(v3,v2),(v2,v5),55,7.4 图的连通性问题,1,v1,v2,v4,v3,v5,v6,6,1,6,5,5,5,6,3,4,2,v1,v2,v4,v3,v5,v6,3,4,2,要点:每当新的顶点并入 U 之后,则调整仍在V-U 集合中的顶点至 U 中顶点的最小距离。,Prim 算法的实例,56,5,7.4 图的连通性问题,typede

31、f struct VertexType vexsMAX; int EdgeMAXMAX; int vexnum, arcnum; MGraph; struct VertexType adjvex;int lowcost; closedge MAX ; void MST_Prim( MGraph G, VertexType u ) k = LocateVex( G, u ); / 求顶点u的序号for( j=1; j=G.vexnum; j+ ) / 初始化辅助数组closedgeif( j!=k ) closedge j = u, G.Edge k j ;closedge k .lowcost

32、 = 0; / 初始时U=u,Prim 算法,57,7.4 图的连通性问题,for( i=1; i0 ,58,7.4 图的连通性问题,Kruscal算法的基本思想:设有一个有 n 个顶点的连通网络 N = V, E ,最初先构造一个只有 n 个顶点,没有边的非连通图 T = V, , 图中每个顶点自成一个连通分量。当在 E 中选到一条具有最小权值的边时,若该边的两个顶点落在不同的连通分量上(没有构成回路),则将此边加入到 T 中;否则将此边舍去,重新选择一条权值最小的边。如此重复下去,直到所有顶点在同一个连通分量上为止。,2 Kruscal 算法,59,7.4 图的连通性问题,Kruscal

33、算法的基本描述设G(V,E)是个有权无向连通图: T V, ; while( T 的边数 n - 1) 在 E 中选择代价最小的边 ( u,v );EE ( u,v );if( ( u,v )不和 T 中已有的边构成回路 )/ 或 if( u,v分属T的不同的连通分量 )TT + ( u,v );,60,7.4 图的连通性问题,用克鲁斯卡尔算法构造最小生成树的过程,7.4 图的连通性问题,应用克鲁斯卡尔算法构造最小生成树的过程,62,路径:在图 G(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点 vp1, vp2, , vpm,到达顶点vj。则称顶点序列 ( vi vp1 vp

34、2 . vpm vj ) 为从顶点vi 到顶点 vj 的路径。它经过的边(vi, vp1)、(vp1, vp2)、.、(vpm, vj)应是属于E的边。 带权图的路径长度:是指路径上各边的权之和。 最短路径:从图中某一顶点u(称为源点)到达另一顶点v(称为终点)的路径中路径长度最短的一条路径称为顶点u到顶点v的最短路径。 最短路径问题的应用: 计算机交通咨询 互连网中的路由算法,7.6 最短路径,63,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,源点,源点 终点 最短路径 路径长度V0 V1 无V2 (V0,V2) 10V3 (V0,V4,V3) 50V

35、4 (V0,V4) 30V5 (V0,V4,V3,V5) 60, 10 30 100 5 50 10 20 60 ,0 1 2 3 4 5,0 1 2 3 4 5,7.6.1 单源最短路径问题:给定带权有向图G和源点v,求从源点v到G中其余各顶点的最短路径。,64,7.6 最短路径,Dijkstra 算法求单源最短路径:设 V 是该有向图的顶点的集合, S 是已求得最短路径的顶点的集合。引进一个辅助数组D,Di表示当前所找到的从v0 至其余各顶点vi的最短路径长度。 S = v0 ; /初始时S中只有顶点v0for ( i=1; in; i+ ) Di = Edge0i;/ v0至vi的边长f

36、or ( i=1; in; i+ ) 选择顶点vj,满足条件 Dj = Min Di | viV-S ;S = S + vj; /将vj 加入集合 Sfor ( 每一个顶点vk V-S ) Dk = Min( Dk, Dj + Edgejk ) ; / 注:顶点v0到顶点vk的最短路径或者是弧(v0,vk),或者是 / (v0,vp1.vpm,vk),其中vp1.vpmS。,65,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,Step0:初始化,Dk为源点V0到Vk的边长。,66,7.6 最短路径,V1,V3,V2,V5,V4,60,10

37、0,V0,20,30,10,50,10,5,Step1:选择当前的最短路径(v0,v2),将v2加入S。,67,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,Step2:更新从v0到v1、v3、v4、v5的最短路径。,68,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,Step3:选择当前的最短路径(v0,v4),将v4加入S。,69,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,Step4:更新从v0到v1、v3、v5的最短路

38、径,70,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,Step5:选择当前的最短路径(v0,v4,v3),将v3加入S。,71,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,Step6:更新从v0到v1、v5的最短路径,72,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,Step7:选择当前的最短路径(v0,v4,v3, v5),将v5加入S。,73,7.6 最短路径,V1,V3,V2,V4,60,100,V0,20,30,1

39、0,50,10,5,Step8:v0到v1不存在路径,其路径长度为。,74,V5,7.6 最短路径,typedef int PathMatrixMAXMAX; typedef int ShortPathTableMAX; void ShortestPath(MGraph G, int v0, PathMatrix ,75,7.6 最短路径,for( i=1; iG.vexnum; i+) /主循环,每次求一个v到v0的最短路径 min = ;for( j=0; jG.vexnum; j+) / 求当前的最短路径的终点vjif( !finalj)if( Dj min ) vj = j; min

40、= Dj; finalvj = TRUE; / 将顶点vj加入Sfor( w=0; wG.vexnum; w+) / 更新当前的最短路径及长度if( !finalw ,76,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,矩阵P,77,矩阵D,矩阵final,(1) 初试状态, 10 30 100 5 50 10 20 60 ,0 1 2 3 4 5,0 1 2 3 4 5,G.Edge,7.6 最短路径,20,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,矩阵P,78,矩阵D,矩阵final,(2)

41、找到V0-V2的最短路径, 并调整V0到V3的最短路径,7.6 最短路径,20,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,矩阵P,79,矩阵D,矩阵final,(3) 找到V0V4的最短路径, 并调整V0到V3,V0到V5的最短路径,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,矩阵P,80,矩阵D,矩阵final,(4) 找到V0V3的最短路径, 并调整V0到V5的最短路径,7.6 最短路径,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,矩阵P,81,矩阵D

42、,矩阵final,(5) 找到V0V5的最短路径,7.6 最短路径,20,V1,V3,V2,V5,V4,60,100,V0,20,30,10,50,10,5,矩阵P,82,矩阵D,矩阵final,(6) V0V1无路径,结束,7.6 最短路径,问题的提法:已知一个各边权值均大于0的带权有向图,对每一对顶点 vi vj,要求求出vi 与vj之间的最短路径和最短路径长度。 Floyd算法的基本思想:定义一个n阶方阵序列: D(-1), D(0), , D(n-1).其中: D(-1) ij = Edgeij;D(k) ij = min D(k-1)ij,D(k-1)ik + D(k-1)kj ,

43、k = 0,1, n-1 D(0) ij是从顶点vi 到vj , 中间顶点是v0的最短路径的长度, D(k) ij是从顶点vi 到vj , 中间顶点的序号不大于k的最短路径的长度, D(n-1)ij是从顶点vi 到vj 的最短路径长度。 最短路径的表示:采用n个PathMatrix类型的矩阵P,表示每个顶点到其余顶点的最短路径,7.6.2 每一对顶点之间的最短路径:Floyd 算法,83,7.6 最短路径,B,C,A,11,4,2,6,3,0 4 11 6 0 2 3 0,A B C,A B C,Floyd算法的运行过程例1 :,84,7.6 最短路径,D,C,B,1,2,4,0 1 3 0 1 5 0 2 4 0,A B C D,A B C D,Floyd算法的运行过程例2 :,A,5,3,1,注:下图中没有画出D(3)与P(3) ,因为D(3)与D(2)相同,P(3)与P(2)相同。,85,7.6 最短路径,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医学治疗 > 基础医学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报