/* 枚举顶点k范围[1,n] 以k为中介点,枚举所有定点对i和j.i和j的范围[1,n] if(dis[i][k]+dis[k][j]<dis[i][j]) dis[i][j]=dis[i][k]+dis[k][j]; */ #include<cstdio> #include<algorithm> using namespace std; const int INF = 0xFFFFFFF; const int MAXV = 200; int n,m; int dis[MAXV][MAXV]; void Floyd() { for(int k=0;k<n;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(void) { int u,v,w; fill(dis[0],dis[0]+MAXV*MAXV,INF); scanf("%d%d",&n,&m); 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(" "); } return 0; } /* input: 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 output: 0 1 5 3 4 6 268435455 0 4 2 5 5 268435455 268435455 0 268435455 268435455 1 268435455 268435455 2 0 3 3 268435455 268435455 268435455 268435455 0 3 268435455 268435455 268435455 268435455 268435455 0 */