- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章节 图 - 完整版
* 原因: 从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]的值再找到该路径上所经过的其它顶点,…依此类推。 ◆ 初始化为Path[i][j]=-1,表示从Vi到Vj 不经过任何(S中的中间)顶点。当某个顶点Vk加入到S中后使A[i][j]变小时,令Path[i][j]=k。 * 例1 15 3 4 1000 10 V2 V4 V3 6 2 8 V1 V3 V4 V2 dist0 * V1 V3 V4 V2 例1 15 3 4 1000 10 6 2 8 V1 V1 V2 V3 V4 V1 V2 V3 V4 * V1 V3 V4 V2 例1 15 3 4 1000 10 V2 V1 6 2 8 * V1 V3 V4 V2 例1 15 3 4 1000 10 V2 V1 6 2 8 V3 * 弗洛伊德算法floyd如下: #define INF 32767 //INF表示∞ #define MAXV 最大顶点个数 void floyd(int cost[][MAXV],int n) { int A[MAXV][MAXV],path[MAXV][MAXV]; int i,j,k; for(i=0;in;i++) //赋值A0[i][j]和path0[i][j] for(j=0;jn;j++) { A[i][j]=cost[i][j]; if cost[i][j]INF path[i][j]=i; else path[i][j]=-1; } for(k=0;kn;k++) //向vi与vj之间中n次加入中间顶点vk for(i=0;in;i++) for(j=0;jn;j++) //求min{Ak[i][j],Ak+1[i][k]+Ak+1[k][j]} if(A[i][j](A[i][k]+A[k][j])) * if(A[i][j](A[i][k]+A[k][j])) { A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } dispath(A,path,n); //输出最短路径 } 以下是输出最短路径的算法dispath,其中ppath()函数在path中递归输出从顶点vi到vj的最短路径。 void ppath(int path[][MAXV],int i,int j) { int k; k=path[i][j]; if(k==-1) //path[i][j]=-1时,顶点vi和vj之间无中间顶点 return; ppath(path,i,k); printf(“%d,”,k); ppath(path,k,j); } * void dispath(int A[][MAXV],int path[][MAXV],int n) { int i,j; for(i=0;in;i++) for(j=0;jn;j++) { if(A[i][j]==INF) { if(i!=j) printf(“从顶点%d到顶点%d没有路径\n”,i,j); } else { printf(“从顶点%d到顶点%d路径为:”,i,j);; printf(“%d ,”,i); ppath(path,i,j); printf(“%d”,j); printf(“路径长度为:%d\n”,A[i][j]); } } } 弗洛伊德算法包含一个三重循环,其时间复杂度为O(n3)。 * Floyd算法允许图中有带负权值的边,但不许有包含带负权值的边组成的回路。 本章给出的求解最短路径的算法不仅适用于带
文档评论(0)