#include <stdio.h> #include <string.h> int edge[51][51],isvisited[51],n,m,s,lowcost[51]; void dijkstra(int vo){ int i,j,min,pre; isvisited[vo]=1; for (i=0;i<n;i++) { lowcost[i]=edge[vo][i]; } lowcost[vo]=0; pre=vo; for (i=1;i<n;i++) { min=100000000; for (j=0;j<n;j++) { if (isvisited[j]==0&&min>lowcost[j]) { min=lowcost[j]; pre=j; } } isvisited[pre]=1; for (j=0;j<n;j++) { if (isvisited[j]==0&&lowcost[j]>edge[pre][j]+lowcost[pre]) { lowcost[j]=edge[pre][j]+lowcost[pre]; } } } } int main(){ int i,j; // freopen("1.txt","r",stdin); while (scanf("%d %d",&n,&s)!=EOF) { memset(isvisited,0,sizeof(isvisited)); for (i=0;i<n;i++) { for (j=0;j<n;j++) { scanf("%d",&edge[i][j]); if (edge[i][j]==0) { edge[i][j]=100000000; } } } dijkstra(s); for (i=0;i<n;i++) { if (i!=s) { if (lowcost[i]==100000000) { printf("-1 "); }else{ printf("%d ",lowcost[i]); } } } printf("\n"); } // fclose(stdin); return 0; } /************************************************************** Problem: 2165 User: admin Language: C Result: Accepted Time:9 ms Memory:1156 kb ****************************************************************/