- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
② 将图中一个顶点Vk 加入到S中,修改A[i][j]的值,修改方法是: A[i][j]=Min{A[i][j] , (A[i][k]+A[k][j]) } 1 算法思想 设顶点集S(初值为空),用数组A的每个元素A[i][j]保存从Vi只经过S中的顶点到达Vj的最短路径长度,其思想是: ① 初始时令S={ } , A[i][j]的赋初值方式是: Wij i≠j且vi,vj∈E, wij为弧上的权值 ∞ i≠j且vi,vj不属于E A[i][j]= 0 i =j时 * 7.7.2 每一对顶点间的最短路径 原因: 从Vj只经过S中的顶点(Vk)到达Vj的路径长度可能比原来不经过Vk的路径更短。 ③ 重复②,直到G的所有顶点都加入到S中为止。 2 算法实现 ◆ 定义二维数组Path[n][n](n为图的顶点数) ,元素Path[i][j]保存从Vi到Vj的最短路径所经过的顶点。 ◆ 若Path[i][j]=k:从Vi到Vj 经过Vk ,最短路径序列是(Vi , …, Vk , …, Vj) ,则路径子序列:(Vi , …, Vk)和(Vk , …, Vj)一定是从Vi到Vk和从Vk到Vj 的最短路径。从而可以根据Path[i][k]和Path[k][j]的值再找到该路径上所经过的其它顶点,…依此类推。 * 7.7.2 每一对顶点间的最短路径 ◆ 初始化为Path[i][j]=-1,表示从Vi到Vj 不经过任何(S中的中间)顶点。当某个顶点Vk加入到S中后使A[i][j]变小时,令Path[i][j]=k。 表7-4给出了利用Floyd算法求图7-26的带权有向图的任意一对顶点间最短路径的过程。 图7-26 带权有向图及其邻接矩阵 0 2 8 ∞ 0 4 5 ∞ 0 V1 4 8 2 V2 V0 5 * 7.7.2 每一对顶点间的最短路径 根据上述过程中Path[i][j]数组,得出: V0到V1 :最短路径是{ 0, 1 } ,路径长度是2 ; V0到V2 :最短路径是{ 0, 1, 2 } ,路径长度是6 ; V1到V0 :最短路径是{ 1, 2, 0 } ,路径长度是9 ; 表7-4 用Floyd算法求任意一对顶点间最短路径 0 2 8 ∞ 0 4 5 ∞ 0 0 2 8 ∞ 0 4 5 7 0 0 2 6 ∞ 0 4 5 7 0 0 2 6 9 0 4 5 7 0 A -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 -1 -1 -1 1 -1 -1 -1 -1 0 -1 -1 -1 1 2 -1 -1 -1 0 -1 Path S { } { 0 } { 0, 1 } { 0, 1, 2 } 步骤 初态 k=0 K=1 K=2 * V1到V2 :最短路径是{ 1, 2 } ,路径长度是4 ; V2到V0 :最短路径是{ 2, 0 } ,路径长度是5 ; V2到V1 :最短路径是{ 2, 0, 1 } ,路径长度是7 ; 算法实现 int A[MAX_VEX][MAX_VEX] ; int Path[MAX_VEX][MAX_VEX] ; void Floyd_path (AdjGraph *G) { int j, k, m ; for ( j=0; jG-vexnum; j++) for ( k=0; kG-vexnum; k++) { A[j][k]=G-adj[j][k] ; Path[j][k]=-1 ; } /* 各数组的初始化 */ * 7.7.2 每一对顶点间的最短路径 for ( m=0; mG-vexnum; m++) for ( j=0; jG-vexnum; j++) for ( k=0; kG-vexnum; k++) if ((A[j][m]+A[m][k])A[j][k]) { A[j][k]=A[j][m]+A[m][k] ; Path[j][k]=k ; } /* 修改数组A和Path的元素值 */ for ( j=0; jG-vexnum; j++) for ( k=0; kG-vexnum; k++) if (j!
文档评论(0)