题目描述
给出一张由 n 个点 m 条边组成的无向图。
求出所有点对 (i,j) 之间的最短路径。
输入格式
第一行为两个整数n,m,分别代表点的个数和边的条数。
接下来 m 行,每行三个整数 u,v,w,代表 u,v 之间存在一条边权为 w 的边。
输出格式
输出 n 行每行 n 个整数。
第 i 行的第 j 个整数代表从 i 到 j 的最短路径。
输入输出样例
输入 #1复制
4 4 1 2 1 2 3 1 3 4 1 4 1 1输出 #1复制
0 1 2 1 1 0 1 2 2 1 0 1 1 2 1 0说明/提示
对于 100% 的数据,n≤100,m≤4500,任意一条边的权值 w 是正整数且 1⩽w⩽1000。
数据中可能存在重边。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long//把所有int换成long long
int n,m;
int dis[10010][10010];//存最短路径
void floyd(){
for(int k=1;k<=n;k++){//以k这个点作为中转点
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
//dis[i][k]+dis[k][j]是计算从i到k点再从k到j点的距离;得最短路
}
}
}
}
signed main(){
cin >> n >> m;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
dis[i][j]=1e18;//初始化为极大值
if(i==j) dis[i][j]=0;
}
}
for(int i = 1;i<=m;i++){
int u,v,w;
cin >> u >> v >> w;
dis[u][v]=min(dis[u][v],w);//得较小值
dis[v][u]=min(dis[v][u],w);
}
floyd();
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
cout << dis[i][j]<<" ";
}
cout << "\n";
}
return 0;
}