Floyd算法(全源最短路径)

匿名 (未验证) 提交于 2019-12-02 23:41:02

1. Floyd算法是用来解决全源最短路径的问题,即给定图G(V,E),求任意两点u,v之间的最短路径长度,算法的思想比较简单,如果存在顶点k,使得以k作为中间顶点时顶点i和顶点j的当前最短距离缩短,则将dis[i][j]更新为dis[i][k] + dis[k][j],由于存在三层循环所以时间复杂度是O(n ^ 3),n为顶点的数量

2. 需要注意的问题是最外层的k循环不能够放入到最里面,因为后面的有可能更新到某一个顶点的时候,前面的顶点i,j顶点已经访问过了,所以不能够再访问了导致有的结果是错误的,所以k循环要放到最外面

下面是有向有权图的例子:

3. 具体的代码如下:

 import java.util.Arrays; import java.util.Scanner; public class Floyd算法 { 	static int d[][]; 	static int n = 0; 	static int edges; 	public static void main(String[] args) { 		Scanner sc = new Scanner(System.in); 		System.out.println("输入顶点的个数: "); 		n = sc.nextInt(); 		d = new int[n][n]; 		System.out.println("输入边的条数: "); 		edges = sc.nextInt(); 		for(int i = 0; i < n; i++){ 			Arrays.fill(d[i], 100000); 		} 		for(int i = 0; i < n; i++){ 			//顶点到自身的距离的长度是0 			d[i][i] = 0; 		} 		System.out.println("输入边的起始顶点, 结束顶点和边的权重: "); 		for(int i = 0; i < edges; i++){ 			int start = sc.nextInt(); 			int end = sc.nextInt(); 			d[start][end] = sc.nextInt(); 		} 		Floyd(); 		for(int i = 0; i < d.length; i++){ 			for(int j = 0; j < d.length; j++){ 				System.out.print(d[i][j] + " "); 			} 			System.out.println(); 		} 		sc.close(); 	} 	 	private static void 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][k] != 0 && d[k][j] != 0 && d[i][k] + d[k][j] < d[i][j]){ 						d[i][j] = d[i][k] + d[k][j]; 					} 				} 			} 		} 	} } 

文章来源: https://blog.csdn.net/qq_39445165/article/details/91491532
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!