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