任意两点之间的最短路径问题(Floyd算法)--Java语言
来源:互联网 发布:game ec 源码 编辑:程序博客网 时间:2024/06/07 10:11
我在前面的一篇博客中详细讲到了有权图中的最短路径问题--dijkstra算法,有兴趣的可以点开下面插件温习一下dijkstra算法。但是,dijkstra算法无法解决边权为负的情况。因为dijkstra在对于路径长短的选择上采用了贪心思想。因此,若某一边权为负,则容易忽略该线路。对于dijkstra算法来说,访问点的选择是选择未访问过的点中距离源点最近的点,而不是对每一种路径可能都进行遍历。
有权图中的最短路径问题--Dijkstra算法(Java语言实现)
而Floyd算法,则修正了dijkstra算法对于边权为负问题的不足,引入了一个外循环,来遍历每个点,从而查询该点是不是在i和j之间,这样的话,无论边权为负值还是正值,都会被考虑进去。对于邻接矩阵A来说,在k-1次迭代后,A(k-1)[i][j]为所有从顶点i到j且不经过k之后的顶点的最小长度,有可能经过k之前的点。所以在遍历过程中需要比较A[i][j]与A[i][k]+A[k][j]的大小,取小值,表示比较经过k点与不经过k点的路径长度大小。
代码实现:
import java.util.*;public class Floyd {public static int[][] path;public static int[][] floyd(int[][] C,int n){path=new int[n][n];for(int i=0;i<n;i++){for(int j=0;j<n;j++){path[i][j]=-1;}}for(int k=0;k<n;k++){for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(C[i][k]!=Integer.MAX_VALUE&&C[k][j]!=Integer.MAX_VALUE&&C[i][k]+C[k][j]<C[i][j]){C[i][j]=C[i][k]+C[k][j];path[i][j]=k;}}}}return C;}public static void main(String[] args) {// TODO Auto-generated method stubint a=Integer.MAX_VALUE;int[][] C= {{0,a,10,a,30,100},{a,0,5,a,a,a},{a,a,0,50,a,a},{a,a,a,0,a,10},{a,a,a,20,0,60},{a,a,a,a,a,0}};int n=C.length;int[][] route=floyd(C,n);for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j) continue;else if(route[i][j]==a)System.out.println(i+"到"+j+"之间没路径");elseSystem.out.println(i+"到"+j+"之间的最短路径长度为:"+route[i][j]);}}}}测试结果:
0到1之间没路径0到2之间的最短路径长度为:100到3之间的最短路径长度为:500到4之间的最短路径长度为:300到5之间的最短路径长度为:601到0之间没路径1到2之间的最短路径长度为:51到3之间的最短路径长度为:551到4之间没路径1到5之间的最短路径长度为:652到0之间没路径2到1之间没路径2到3之间的最短路径长度为:502到4之间没路径2到5之间的最短路径长度为:603到0之间没路径3到1之间没路径3到2之间没路径3到4之间没路径3到5之间的最短路径长度为:104到0之间没路径4到1之间没路径4到2之间没路径4到3之间的最短路径长度为:204到5之间的最短路径长度为:305到0之间没路径5到1之间没路径5到2之间没路径5到3之间没路径5到4之间没路径
Floyd算法与dijkstra算法相比的优势之处在于可以处理边权为负值的情况,但是不足之处在于,它对每一种路径都进行了迭代,用了三层循环,所以时间复杂度比dijkstra算法高,为O(n^3)。
转发请注明:转自http://blog.csdn.net/carson0408/article/details/78707444
阅读全文
1 0
- 任意两点之间的最短路径问题(Floyd算法)--Java语言
- 任意两点之间的最短路径问题(Floyd-Warshall算法)
- floyd算法(求任意两点间的最短路径)
- Floyd算法(任意两点间的最短路径)
- POJ 2139-- 最短路径 (floyd算法,任意两点间的最短路径)
- Dijkstra单源最短路径实现 及 Floyd任意两点之间的最短路径
- 运用Floyd算法求得带权有向图任意两点间的最短路径C/C++
- 任意两点之间最短路径
- Floyd --任意两点之间的最短路问题
- 任意两点间的最短路径---floyd_warshall算法
- 求有向网中任意一对顶点之间的最短路径 Floyd算法
- Floyd(求图中任意两点最短路径)
- 任意两点的最短路问题 Floyd-Warshall算法
- 任意两点间的最短路问题(floyd算法)
- Floyd-算法--任意两点间的最短路问题
- 任意两点间的最短路径
- Floyed算法求两点之间的最短路径
- ACM-Floyed算法求两点之间的最短路径
- 【LeetCode】Array Topic总结
- 没有网照样激活软件,用亿图就是这么任性!
- 【java基础】02.Collection类集
- android权限大全
- String和StringBuffer的replace问题
- 任意两点之间的最短路径问题(Floyd算法)--Java语言
- (数据结构)七种常用的排序算法分析及代码实现(上)
- 要努力啊!
- appserv安装之后无法访问localhost
- Android之BroadcastReceiver总结
- 内存分配与回收策略
- java 多态的理解(2)
- Android中实现 滑动时将指定View定位在顶部
- c# windows 服务 定时器 每天凌晨0点整执行任务