求解任意两个顶点之间的最短路径,思路:
我们都知道,要使得两个顶点之间的路径变短,可以通过添加第三个顶点的方式来达到。即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