#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 ****************************************************************/