Floyd 算法小结
来源:互联网 发布:2016java人才缺口 编辑:程序博客网 时间:2024/05/22 14:05
学习完Floyd算法后,本想找个题做但没找到就先做一下总结吧!
算法思想:
最短距离有三种情况:
1、两点的直达距离最短。(如下图<v,x>)
2、两点间只通过一个中间点而距离最短。(图<v,u>)
3、两点间用通过两各以上的顶点而距离最短。(图<v,w>)
对于第一种情况:在初始化的时候就已经找出来了且以后也不会更改到。
对于第二种情况:弗洛伊德算法的基本操作就是对于每一对顶点,遍历所有其它顶点,看看可否通过这一个顶点让这对顶点距离更短,也就是遍历了图中所有的三角形(算法中对同一个三角形扫描了九次,原则上只用扫描三次即可,但要加入判断,效率更低)。
对于第三种情况:如下图的五边形,可先找一点(比如x,使<v,u>=2),就变成了四边形问题,再找一点(比如y,使<u,w>=2),可变成三角形问题了(v,u,w),也就变成第二种情况了,由此对于n边形也可以一步步转化成四边形三角形问题。(这里面不用担心哪个点要先找哪个点要后找,因为找了任一个点都可以使其变成(n-1)边形的问题)。
Floyd算法就是每次在两点之间插入一点,看是否路径更短,如果更短则更新其值。相当于一个多边形不断缩小,不断进行优化。
代码(模版):
for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];
调用它之前先初始化:d[ i ][ i ]=0 ;如果两个点不相连则令其为无穷大;
代码(权值很大的情况):
for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(d[i][j]>d[i][k]+d[k][j]&&d[i][j]<INF&&d[k][j]<INF) d[i][j]=d[i][k]+d[k][j];
INF的值必须大于权值中的最大值。
- Floyd 算法小结
- [图论]Floyd 算法小结
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- floyd 算法
- Floyd算法
- floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- floyd算法
- Floyd算法
- 文本语言模型的参数估计-最大似然估计、MAP及贝叶斯估计——转自北大杨柳同学
- linux中安装Clamav以及配置和使用(扫描感染文件)
- java中queue的使用
- 黑马程序员__集合框架(List,Set)
- Android 如何隐藏应用程序的图标
- Floyd 算法小结
- 往死里写——ECAT_Main()状态机处理
- Apple Developer Website Update
- 豆瓣的curl测试
- Java 的 vector 中非基本类型的删除
- 初始化一个list集合
- 关于__attribute__中section部分的一些了解
- 互斥信号量 二进制信号量
- 【jiasuba】教你快速对异常错误进行更正