- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 显然,强连通图只有一个强连通分量,即其自身,而非强连通图有多个连通分量。 * 所以,对于有向图,要根据实际需要考虑采取邻接表还是逆邻接表存储,必要时,也可以将邻接表和逆邻接表合并。 * * 弗洛伊德算法仍然使用前面定义的图的邻接矩阵edges[n+1][n+1]来存储带权有向图。算法的基本思想是:设置一个n * n的矩阵A(k),其中除对角线的元素都等于0外,其它元素a(k)[i][j]表示顶点i到顶点j的路径长度,K表示运算步骤。开始时,以任意两个顶点之间的有向边的权值作为路径长度,没有有向边时,路径长度为∞,当K=0时, A (0)[i][j]=edges[i][j] 以后逐步尝试在原路径中加入其它顶点作为中间顶点,如果增加中间顶点后,得到的路径比原来的路径长度减少了,则以此新路径代替原路径,修改矩阵元素。具体做法为: * * 第一步,让所有边上加入中间顶点1,取A[i][j]与A[i][1]+A[1][j]中较小的值作A[i][j]的值,完成后得到A(1), 第二步,让所有边上加入中间顶点2,取A[i][j]与A[i][2]+A[2][j]中较小的值,完成后得到A(2)…,如此进行下去,当第n步完成后,得到A(n),A(n)即为我们所求结果,A(n)[i][j]表示顶点i到顶点j的最短距离。 因此,弗洛伊德算法可以描述为: A(0)[i][j]=edges[i][j]; //edges为图的邻接矩阵 A(k)[i][j]=min{A(k-1) [i][j],A(k-1) [i][k]+A(k-1) [k][j]} 其中 k=1,2,…,n * * Floyd算法的基本思想: 定义一个n阶方阵序列: D(-1), D(0), …, D(n-1). 其中 D(-1) [i][j] = G.arcs[i][j]; D(k) [i][j] = min { D(k-1)[i][j], D(k-1)[i][k] + D(k-1)[k][j] }, k = 0,1,…, n-1 D(0) [i][j]是从顶点vi 到vj , 中间顶点是v0的最短路径的长度, D(k) [i][j]是从顶点vi 到vj , 中间顶点的序号不大于k的最短路径长度, D(n-1)[i][j]是从顶点vi 到vj 的最短路径长度。 * * Floyd算法允许图中有带负权值的边,但不许有包含带负权值的边组成的回路。 本章给出的求解最短路径的算法不仅适用于带权有向图,对带权无向图也可以适用。因为带权无向图可以看作是有往返二重边的有向图,只要在顶点vi 与vj 之间存在无向边(vi , vj ),就可以看成是在这两个顶点之间存在权值相同的两条有向边 vi , vj 和 vj , vi 。 * * 求以邻接矩阵为存储结构,求各顶点的最短路径的Floyd算法 #define INF 32767 /*INF表示∞*/ void floyd(MGraph *G) { int A[MaxVertexNum][ MaxVertexNum],P[MaxVertexNum][ MaxVertexNum]; int i,j,k; for(i=0;iG-n;i++) /*赋值A(-1)[i][j]和P(-1)[i][j]*/ for(j=0;jG-n;j++) { A[i][j]=G-edges[i][j]; P[i][j]=-1; } for(k=0;kG-n;k++) /*向vi与vj之间重复n次加入中间顶点vk*/ for(i=0;iG-n;i++) for(j=0;jG-n;j++) /*求 min{ A(k-1) [i][j],A(k-1) [i][k]+A(k-1) [k][j] }*/ if(A[i][j](A[i][k]+A[k][j])) { A[i][j]=A[i][k]+A[k][j]; P[i][j]=k; } dispath(A, P, G-n); /*输出最短路径*/ } * * void ppath(int P[][MaxVertexNum],int i,int j) { int k; k=P[i][j]; if(k==-1) /*
您可能关注的文档
最近下载
- 高等数学英文1-6-10.ppt VIP
- 高等数学英文1-5-10全省公开课一等奖省赛获奖精品课件.pptx VIP
- 配电自动化终端运行维护管理规程(试行) 2.pdf VIP
- 茅台工艺员题库.pdf VIP
- 人大附中学习方法-自学.ppt VIP
- 高中物理必修三全套复习课件练习题及答案解析.doc VIP
- 人乳头瘤病毒核酸分型检测试剂盒说明书-硕世生物.pdf VIP
- 基于国家智慧教育云平台的家校共育协同模式在初中物理实验教学中的应用研究教学研究课题报告.docx
- 7第七章 裤装缝制工艺_2(课件)-《服装工艺(第4版)》同步教学(纺织出版社).pptx VIP
- 实用资料_配电自动化终端运行维护管理规定.doc VIP
文档评论(0)