这题经过的结点比较好处理。
主要是字典序的处理。
先是floyd做法,采用记录后驱的方法。 path[i][j]=j【初始化。。。】
#include <iostream> #include <cstdio> #include <cstring> #include <cstring> using namespace std; const int maxn=5000; const int INF=100000000; int n; int node[maxn]; int dist[maxn][maxn]; int path[maxn][maxn]; void floyd() { for(int i=1;i<=n;i++)//初始化 有一种后驱的感觉 for(int j=1;j<=n;j++) path[i][j]=j; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { int temp=dist[i][k]+dist[k][j]+node[k]; if(dist[i][j]>temp) { dist[i][j]=temp; path[i][j]=path[i][k]; } if(dist[i][j]==temp) { if(path[i][j]>path[i][k]) path[i][j]=path[i][k]; } } } int main() { int a,be,en; while(scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&a); if(a!=-1) dist[i][j]=a; else dist[i][j]=INF; } for(int i=1;i<=n;i++) scanf("%d",&node[i]); floyd(); int kcase=0; while(1) { if(kcase!=0) printf(" "); kcase++; scanf("%d%d",&be,&en); if(be==-1&&en==-1) break; printf("From %d to %d : ",be,en); printf("Path: "); printf("%d",be); int temp=be; while(temp!=en) { printf("-->%d",path[temp][en]); temp=path[temp][en]; } printf(" "); printf("Total cost : %d ",dist[be][en]); } } return 0; }
接下来是spfa的做法。