图论 最短路径floyd
来源:互联网 发布:mac查看wi fi密码 编辑:程序博客网 时间:2024/05/16 14:25
(终于想到了办法去证明floyd算法实现的正确性,见程序后)
floyd算法的目的:求出图中任一节点到任一节点的最短路径。
floyd 算法的基本思想是:s[i][j] = s[i][k] + s[k][j] (s[i][j]表示从节点i到节点j的最短路径),然后通过变换不同的K值,来实现求出节点i到节点j的最短路径。
具体实现如下:
//size 为图的节点个数void floyd(int size){ int i,j,k;//graph 为图的存储矩阵//s[i][j]为图中从节点i到节点j的最短距离//path[i][j] 为从节点i到节点j的最短路径上,紧挨j节点的上一个节点//可通过path[i][j]打印出各个最短路径所经过的节点 for(i=0;i<size;i++) { for(j=0;j<size;j++) {//初始化s s[i][j]=graph[i][j];//s[i][j]==INF 表示不能到达,则path[i][j]=-1//否则path[i][j]=i if (s[i][j]!=INF) {path[i][j]=i; }else{path[i][j]=-1;} } } for(k=0;k<size;k++) { for(i=0;i<size;i++) { for(j=0;j<size;j++) { int temp=s[i][k]+s[k][j];//如果同过k可以缩短路径长度,则更新s[i][j]和path[i][j] if(temp<s[i][j]) { s[i][j]=temp; path[i][j]=path[k][j]; } } } }}
算法正确性证明:
- 直连路径若为最短路径,则在s矩阵初始化后就不会改变。
- 当k=0时,程序会计算出从节点i到节点j,最多只经过一个中间节点,即0节点,的全部的最短路径,以后的计算k=1时,以此为基础。(s矩阵的变化以初始值为基础)
- 当k=1时,程序会计算出从节点i到节点j,最多只经过两个节点,即0节点和1节,点的全部的最短路径,以后的计算k=2时,以此为基础。(s矩阵的变化以k=1计算出的值为基础)
- …………………………
- k=size-1时,程序会计算出从节点i到节点j,最多只经过0、1、……、size-1节点,即全部节点,的最短路径。(s矩阵的变化以k=n-1计算出的值为基础)
- 证毕。
- 图论 最短路径floyd
- Floyd 最短路径
- Floyd最短路径
- 最短路径Floyd
- 最短路径---Floyd
- 图论 最短路径Floyd算法
- Floyd最短路径算法
- joj1198Risk (Floyd 最短路径)
- 最短路径(Floyd算法)
- 最短路径 floyd算法
- 最短路径--Floyd算法
- Floyd最短路径算法
- Floyd最短路径算法
- 最短路径Floyd算法
- 最短路径 Floyd算法
- Floyd最短路径算法
- 最短路径floyd算法
- 最短路径(floyd算法)
- ssh框架(调整和设置)
- perl 面向对象 笔记
- vc 网络编程(socket)
- 通过NSTimer看IPhone对@selector的函数如何传参数
- WebService学习:SOPA与WSDL基本语法
- 图论 最短路径floyd
- 理解JavaScript作用域和作用域链
- 结业了
- 【php】php安全设定
- 优秀程序员的45个习惯
- 引用 JAVA EL表达式详细介绍使用手册
- 构建自己的C/C++插件开发框架
- java之Collection接口讲解
- 机房收费系统之报表