#include<stdio.h>
#define INFINITY 65535
typedef struct Graph
{
int vex[51];
int arc[51][51];
int vexnum,arcnum;//顶点数、边数
}Graph;
int CreateGraph(Graph *G,int n)
{
int i,j;
G->vexnum=n;
for(i=0;i<n;i++)
G->vex[i]=i;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&G->arc[i][j]);
return 0;
}
void ShortestPath(Graph *G,int P[51][51][51],int D[51][51])
{
int v,w,u,i;
for(v=0;v<G->vexnum;v++)
for(w=0;w<G->vexnum;w++)
{
D[v][w]=G->arc[v][w];
if(v!=w&&!G->arc[v][w])
D[v][w]=INFINITY;
for(u=0;u<G->vexnum;u++)
P[v][w][u]=0;
if(D[v][w]<INFINITY)
P[v][w][u]=P[v][w][w]=1;
}
for(u=0;u<G->vexnum;u++)
for(v=0;v<G->vexnum;v++)
for(w=0;w<G->vexnum;w++)
if(D[v][u]+D[u][w]<D[v][w]&&D[v][u]+D[u][w])
{
D[v][w]=D[v][u]+D[u][w];
for(i=0;i<G->vexnum;i++)
P[v][w][i]=(P[v][u][i]||P[u][w][i]);
}
for(u=0;u<G->vexnum;u++)
{
for(v=0;v<G->vexnum;v++)
{
if(D[u][v]==INFINITY)
printf("-1 ");
else
printf("%d ",D[u][v]);
}
printf("\n");
}
}
int main()
{
int n;//n个顶点,源点为s
scanf("%d",&n);
Graph G;
CreateGraph(&G,n);
int P[51][51][51],D[51][51];
ShortestPath(&G,P,D);
return 0;
}
/**************************************************************
Problem: 2166
User: admin
Language: C
Result: Accepted
Time:7 ms
Memory:1560 kb
****************************************************************/