【大话数据结构C语言】48 最短路径(弗洛伊德算法)

举报
CodeAllen 发表于 2021/10/29 23:09:20 2021/10/29
【摘要】 欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777     迪杰特斯拉算法对比弗洛伊德算法 O(n^2)   O(n^3)   可见前...

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取资源
程序员技术交流①群:736386324 ,程序员技术交流②群:371394777    

迪杰特斯拉算法对比弗洛伊德算法
O(n^2)   O(n^3)
 
可见前者是明显优于后者的
因为迪杰特斯拉算法求的是一个顶点到所有顶点的最短路径,但弗洛伊德算法是求所有顶点到所有顶点的最短路径。
弗洛伊德算法非常简洁优雅
 

弗洛伊德算法

弗洛伊德的核心思想是:对于网中的任意两个顶点(例如顶点 A 到顶点 B)来说,之间的最短路径不外乎有 2 种情况:
  1. 直接从顶点 A 到顶点 B 的弧的权值为顶点 A 到顶点 B 的最短路径;
  2. 从顶点 A 开始,经过若干个顶点,最终达到顶点 B,期间经过的弧的权值和为顶点 A 到顶点 B 的最短路径。
 
 
 
floyd.c

   
  1. #define MAXVEX  9
  2. #define INFINITY    65535
  3. typedef int Pathmatirx[MAXVEX][MAXVEX];
  4. typedef int ShortPathTable[MAXVEX][MAXVEX];
  5. void ShortestPath_Floyd(MGraph G, Pathmatirx *P, ShortPathTable *D)
  6. {
  7.     int v, w, k;
  8.     
  9.     // 初始化D和P
  10.     for( v=0; v < G.numVertexes; v++ )
  11.     {
  12.         for( w=0; w < G.numVertexes; w++ )
  13.         {
  14.             (*D)[v][w] = G.matirx[v][w];
  15.             (*P)[v][w] = w;
  16.         }
  17.     }
  18.     
  19.     // 优美的弗洛伊德算法
  20.     for( k=0; k < G.numVertexes; k++ )
  21.     {
  22.         for( v=0; v < G.numVertexes; v++ )
  23.         {
  24.             for( w=0; w < G.numVertexes; w++ )
  25.             {
  26.                 if( (*D)[v][w] > (*D)[v][k] + (*D)[k][w] )
  27.                 {
  28.                     (*D)[v][w] = (*D)[v][k] + (*D)[k][w];
  29.                     (*P)[v][w] = (*P)[v][k];        // 请思考:这里换成(*P)[k][w]可以吗?为什么?
  30.                 }
  31.             }
  32.         }
  33.     }
  34. }

 

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/116811983

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。