Floyd Warshell 算法求解多源点最短路径

来源:互联网 发布:手机相册软件下载 编辑:程序博客网 时间:2024/05/17 21:43

求解任意两个顶点之间的最短路径,思路:

我们都知道,要使得两个顶点之间的路径变短,可以通过添加第三个顶点的方式来达到。即i到k,k到j使得路径变短,有的时候还要通过添加多个顶点来实现,基于这个原理

假设一开始只允许通过1顶点进行变换路径,那么只需要判断e[i][1]+e[1][j]和e[i][j]的大小,不断更新,i 和 j都是从1到n,同理,继续使得可以通过的顶点变多,变为1,2顶点,推理过程一样,继续下去,1,2,3.。。。 顶点,最终求得任意两个顶点的最短路径,通过一个三重循环即可,下面上代码:

import java.util.*;public class Main {static Scanner in  = new Scanner(System.in);static int INF = 99999999;static int[][] matrx = new int[100][100];static int n,m; public static void main(String[] args) {while(in.hasNext()){ n = in.nextInt(); m = in.nextInt();  for (int i = 1; i <=n; i++) {for (int j = 1; j <= n; j++) {if(j==i)  matrx[i][j]=0;else  matrx[i][j]=INF;}} for (int i = 0; i <m; i++) {   matrx[in.nextInt()][in.nextInt()]=in.nextInt();} //k代表可以允许通过的顶点 for (int k = 1; k <= n; k++) { //i,j表示任意两个顶点的尝试for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if(matrx[i][k]+matrx[k][j]<matrx[i][j])matrx[i][j]=matrx[i][k]+matrx[k][j];}}} //打印最后结果表  for (int i = 1; i <=n; i++) {for (int j = 1; j <= n; j++) {          System.out.print(matrx[i][j]+" ");}System.out.println(); }    }  }}//结果示例//4 8//1 2 2//1 3 6//1 4 4//2 3 3//3 1 7//3 4 1//4 1 5//4 3 12//0 2 5 4 //9 0 3 4 //6 8 0 1 //5 7 10 0 


原创粉丝点击