emmm,最暴力的最短路了。
/*
时间复杂度:O(n3)点的数量
*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 100
#define inf 0x3f3f3f3f
int n,m,cost[MAX][MAX];//n表示点的数量 m表示边的数量 cost表示花费
void init()//初始化
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
cost[i][j]=0;
else
cost[i][j]=inf;
}
}
}
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(cost[i][k]<inf&&cost[k][j]<inf&&cost[i][j]>cost[i][k]+cost[k][j])
cost[i][j]=cost[i][k]+cost[k][j];
//也可以用来求有向图的传递闭包
// cost[i][j]=cost[i][j]||(cost[i][k]&&cost[k][j]);
}
int main()
{
cin>>n>>m;
init();
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
//无向图
cost[a][b]=c;
cost[b][a]=c;
}
floyd();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<cost[i][j]<<endl;
}
}
return 0;
}
/*
in:
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 2 12
out:
0
2
5
5
2
0
3
4
5
3
0
1
5
4
1
0
*/