先输入顶点个数n,然后输入每条边的数据。顶点序号从0开始,最后一行为-1 -1 -1,表示输入结束。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<string> #include<cmath> #include<map> using namespace std; const int INF=1000000; const int maxn=20; int n; int edge[maxn][maxn]; int s[maxn]; int dist[maxn]; int path[maxn]; void dijkstra(int v) { for(int i=0;i<n;i++) { dist[i]=edge[v][i]; s[i]=0; if(i!=v && dist[i]<INF) path[i]=v; else path[i]=-1; } s[v]=1;dist[v]=0;// for(int i=0;i<n-1;i++) { int min=INF,u=v; for(int j=0;j<n;j++) if(!s[j] && dist[j]<min) { u=j;min=dist[j]; } s[u]=1; for(int k=0;k<n;k++) if(!s[k] && edge[u][k]<INF && dist[u]+edge[u][k]<dist[k]) { dist[k]=dist[u]+edge[u][k]; path[k]=u; } } } int main() { int u,v,w; scanf("%d",&n); memset(edge,0,sizeof(edge)); while(1) { scanf("%d%d%d",&u,&v,&w); if(u==-1 && v==-1 && w==-1) break; edge[u][v]=w; } for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i!=j && edge[i][j]==0) edge[i][j]=INF; dijkstra(0); int shortest[maxn]; for(int i=1;i<n;i++) { printf("%d\t",dist[i]); memset(shortest,0,sizeof(shortest)); int k=0; shortest[k]=i; while(path[shortest[k]]!=0) { k++; shortest[k]=path[shortest[k-1]]; } k++;shortest[k]=0; for(int j=k;j>0;j--) printf("%d->",shortest[j]); printf("%d\n",shortest[0]); } return 0; }
究竟是我抛弃了历史,还是历史遗弃了我。