import java.util.Arrays;
import java.util.Scanner;
public class Floyd {
// 求解图中任意两个结点的最短路径
// 输入:
// 正整数N 表示图中N个结点
// 正整数M 表示图中M条边
// i,j,w 表示两个结点的权值
public static void main(String[] args) {
final int INF = Integer.MAX_VALUE;
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
//创建边权值数组
int[][] edges = new int[N][N];
// 路径矩阵
int[][] path = new int[N][N];
//赋初始值
for (int i = 0; i<N; i++){
for (int j = 0; j<N; j++){
if(i!=j){
edges[i][j] = INF;
}
}
}
//读取边权重
for (int i = 0; i<M; i++){
int sour = sc.nextInt();
int des = sc.nextInt();
int w = sc.nextInt();
edges[sour][des] = w;
edges[des][sour] = w;
path[sour][des] = sour;
path[des][sour] = des;
}
// Floyd算法
for (int k = 0; k< N; k++){
for (int i = 0; i< N; i++){
for (int j = 0; j< N; j++){
int temp = (edges[i][k] == INF || edges[k][j] == INF)? INF : (edges[i][k] + edges[k][j]);
if(temp<edges[i][j]){
edges[i][j] = temp;
path[i][j] = path[k][j];
}
}
}
}
//输出结点间的最短距离
for (int i = 0; i<N; i++){
for (int j = 0; j<N; j++){
System.out.print(edges[i][j] + " ");
}
System.out.println();
}
//输出结点间的最短距离 路径
for (int i = 0; i<N; i++){
for (int j = 0; j<N; j++){
if(i==j) continue;
System.out.print(String.format("结点%d与结点%d的最短权值:%d 路径:", i, j, edges[i][j]));
getPath(i, j ,path);
System.out.println();
}
}
}
public static void getPath(int i, int j, int[][] path){
if(path[i][j] == i){
System.out.print(i + " " + j + " " );
}else {
getPath(i, path[i][j], path);
System.out.print( j + " " );
}
}
}
Floyd算法
最新推荐文章于 2024-09-09 18:28:37 发布