题目链接
题目的提示,讲解的很好,通过不断增加可以通过的节点的,然后更新最短路
#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define LL long long
#define pb push_back
#define gcd __gcd
#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)
const int maxn = 1e3+10;
const int inf = 1 << 28;
int dp[maxn][maxn];
int main(){
int n,m;scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
dp[i][j] = inf;
if(i==j)dp[i][j]=0;
}
}
while(m--){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
dp[x][y]=dp[y][x]=min(dp[x][y],z);
}
for(int k=0;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dp[i][j]=min(dp[i][k]+dp[k][j],dp[i][j]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j==1)
printf("%d",dp[i][j]);
else
printf(" %d",dp[i][j]);
}
puts("");
}
return 0;
}