/*
The matrix is too magical Orz, the internet is mostly SPFA, but I think Dijkstra can do
Think of the n*n matrix as a one-way edge distance matrix.
*/
#include <iostream>#include<cstring>#include<cstdio>#include<queue>#defineMAXN 500#defineINF 1<<30using namespacestd;intA[MAXN][MAXN];intN;intDIST[MAXN],VIS[MAXN];intDijkstraintSintt) {memset (dist,0,sizeofDist); memset (Vis,0,sizeofvis); for(intI=0; i<=n;i++) if(i==s) dist[i]=INF; ElseDist[i]=A[s][i]; while(1){ intk=-1; intmin=INF; for(intI=1; i<=n;i++) if(!vis[i]&&dist[i]<Min) {Min=Dist[i]; K=i; } if(k==-1) Break; VIS[K]=true; for(intI=1; i<=n;i++) if(!vis[i]&&dist[i]>dist[k]+A[k][i]) dist[i]=dist[k]+A[k][i]; } returndist[t];}intMain () { while(SCANF ("%d", &n) = =1){ for(intI=1; i<=n;i++) for(intj=1; j<=n;j++) scanf ("%d",&A[i][j]); printf ("%d\n", Min (Dijkstra (1, n), Dijkstra (1,1)+Dijkstra (n,n)); } return 0;}
hdu4370 Dijkstra matrix to unidirectional edge shortest circuit matrix + self-loop closed loop