#include<bits/stdc++.h>
using namespace std;
const int maxn = 200;
const int INF = 100000;
int n, m; //n为点数,m为边数
int dis[maxn][maxn]; //dis[i][j]表示i到j的距离
void Floyd()
{
for(int k = 0; k < n; k++) //注意最外层的k循环不能放到内层(即i->j->k)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(dis[i][k] != INF && dis[k][j] != INF && dis[i][k] + dis[k][j] < dis[i][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}
int main()
{
int u, v, w;
scanf("%d%d", &n, &m);
fill(dis[0], dis[0] + maxn * maxn, INF);
for(int i = 0; i < n; i++)
dis[i][i] = 0;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &u, &v, &w);
dis[u][v] = w; //以有向图为例
}
Floyd();
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
printf("%d ", dis[i][j]);
}
printf("\n");
}
return 0;
}
输入
6 8
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
输出
0 1 5 3 4 6
100000 0 4 2 5 5
100000 100000 0 100000 100000 1
100000 100000 2 0 3 3
100000 100000 100000 100000 0 3
100000 100000 100000 100000 100000 0