一.Floyd算法

假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s][j](t<=s<=k)的所有值,并取其中最小者即可。因此可以设置一个中间顶点k(0<=k<n)分别插入到每队顶点(i,j)之中,并更新dist[i][j]的值。当n个顶点插入到每队顶点之中,求解便结束了。其实Floyd算法实质上是一个动态规划算法。

  1 /*每对顶点之间最短路径Floyd 2011.8.27*/
  2
  3 #include <iostream>
  4 #include <stack>
  5 #define M 100
  6 #define N 100
  7 using namespace std;
  8
  9 typedef struct node
 10 {
 11     int matrix[N][M];      //邻接矩阵
 12     int n;                 //顶点数
 13     int e;                 //边数
 14 }MGraph;
 15
 16 void FloydPath(MGraph g,int dist[N][M],int path[N][M])
 17 {
 18     int i,j,k;
 19     for(i=0;i<g.n;i++)
 20         for(j=0;j<g.n;j++)
 21         {
 22             if(g.matrix[i][j]>0)
 23             {
 24                 dist[i][j]=g.matrix[i][j];
 25                 path[i][j]=i;
 26             }
 27             else
 28             {
 29                 if(i!=j)
 30                 {
 31                     dist[i][j]=INT_MAX;
 32                     path[i][j]=-1;
 33                 }
 34                 else
 35                 {
 36                     dist[i][j]=0;
 37                     path[i][j]=i;
 38                 }
 39             }
 40         }
 41     for(k=0;k<g.n;k++)     //中间插入点(注意理解k为什么只能在最外层)
 42         for(i=0;i<g.n;i++)
 43             for(j=0;j<g.n;j++)
 44             {
 45                 if((dist[i][k]>0&&dist[i][k]<INT_MAX)&&      //防止加法溢出
 46                       (dist[k][j]>0&&dist[k][j]<INT_MAX)&&
 47                     dist[i][k]+dist[k][j]<dist[i][j])
 48                 {
 49                     dist[i][j]=dist[i][k]+dist[k][j];
 50                     path[i][j]=path[k][j];   //path[i][j]记录从i到j的最短路径上j的前一个顶点
 51                    }
 52             }
 53 }
 54
 55 void showPath(int path[N][M],int s,int t)    //打印出最短路径
 56 {
 57     stack<int> st;
 58     int v=t;
 59     while(t!=s)
 60     {
 61         st.push(t);
 62         t=path[s][t];
 63     }
 64     st.push(t);
 65     while(!st.empty())
 66     {
 67         cout<<st.top()<<" ";
 68         st.pop();
 69     }
 70
 71 }
 72
 73 int main(int argc, char *argv[])
 74 {
 75     int e,n;
 76     while(cin>>e>>n&&e!=0)
 77     {
 78         int i,j;
 79         int s,t,w;
 80         MGraph g;
 81         int dist[N][M],path[N][M];
 82         g.n=n;
 83         g.e=e;
 84         for(i=0;i<g.n;i++)
 85             for(j=0;j<g.n;j++)
 86                 g.matrix[i][j]=0;
 87         for(i=0;i<e;i++)
 88         {
 89             cin>>s>>t>>w;
 90             g.matrix[s][t]=w;
 91         }
 92         FloydPath(g,dist,path);
 93         for(i=0;i<g.n;i++)
 94             for(j=0;j<g.n;j++)
 95                 {
 96                     if(dist[i][j]>0&&dist[i][j]<INT_MAX)
 97                     {
 98                         showPath(path,i,j);
 99                         cout<<dist[i][j]<<endl;
100                     }
101                 }
102     }
103     return 0;
104 }

(转)http://www.cnblogs.com/dolphin0520/archive/2011/08/27/2155542.html

最短路径算法----floyd(转)相关推荐

  1. 短小精悍的多源最短路径算法—Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  2. 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较

        几大最短路径算法比较 转自:http://blog.csdn.net/v_july_v/article/details/6181485 几个最短路径算法的比较: Floyd        求多 ...

  3. 判断有向图g中顶点i到顶点j是否有路径_号称图的最短路径算法--Floyd算法

    暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表 ...

  4. 图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)

    带权无向图->最小生成树算法->Prim算法: 思路: 首先,我们先设置两个集合,U_{}:一个用来放最小生成树的顶点,T_{}:一个用来放最小生成树的边.选取最开始的点V_0,将V_0放 ...

  5. 弗洛伊德算法Floyd

    全知识整理目录 数据结构整理的目录包括了许多的数据结构相关知识. 目录 概述 算法过程 关键代码的实现 总结 参考 概述 Floyd算法是什么? Floyd算法也是动态规划的求最短路径,但不同于Dij ...

  6. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法

    一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...

  7. 最短路径算法——Dijkstra and Floyd算法

    一.     前言:     这个古老的算法应该耳熟能详了吧,但是我自从从学校出来到现在,最短路径算法都没有实际运用过,最近在一个GIS项目中总算用到了,于是乎把教材重温了下,同时查阅了网上很多的资料 ...

  8. 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)

    带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法:有向图的最短路径算法有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包 ...

  9. 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)

    带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法:有向图的最短路径算法有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包 ...

最新文章

  1. oracle 视图使用rownum,Oracle数据对象--视图
  2. java基础----数字签名算法的介绍
  3. C++ 流类和流对象
  4. 【转】新.Net开发必备工具详解之Snippet Compiler。
  5. vue 插件 滑块验证_Vue插件之滑动验证码
  6. Python+OpenCV:交互式图像前景提取(Interactive Foreground Extraction using GrabCut Algorithm)
  7. div背景图自适应占满
  8. 监控的1080P、3MP和5MP是什么意思?区别是什么?
  9. 有indexPath获取到cell对象
  10. c语言计算器自动计算源代码,c语言计算器源代码
  11. 安科瑞ACY100油烟浓度在线监控仪在浙江省某市餐饮油烟监测治理项目中的应用
  12. 气溶胶反演输入转化错误_暗目标法的Himawari-8静止卫星数据气溶胶反演
  13. php源雄武,8个新鲜的PHP常用代码
  14. 计算机毕业设计Python+uniapp实验室考勤小程序(小程序+源码+LW)
  15. echarts地图的常见用法:基本使用、区域颜色分级、水波动画、区域轮播、给地图添加背景图片和图标、3d地图
  16. javascript返回多个参数
  17. ipad键盘使用快捷键_每个iPad使用者都应该知道的20个键盘快捷键
  18. Open Cascade 多视图-多个3D视图
  19. 【Linux】嵌入式Linux系统的移植(下篇:BootLoader,以U-Boot为例)
  20. ARM-CPU工作原理,基于ARM的SOC讲解

热门文章

  1. 255.255.255.255代表什么_LCD 党的真香警告?最近各家炒得很火的 DC 和 PWM 调光是什么鬼...
  2. 超简单的利用plist 查看ipa包名及其它信息
  3. 在SuSE10.1上安装Oracle10g
  4. 打印日志的10个建议
  5. 读博文学Android
  6. (转)光照图的理论和实践
  7. Android Apk包的签名出库、自动编译与混淆
  8. js实现选中文字 分享功能
  9. vimrc常用配置项
  10. 离线java人脸识别开源算法_Java 离线人脸识别 基于ArcFace 2.0 Demo