FLOYD和DIJ记录Path
p[i][j]定义从i到j下一步要到的点,及子问题变成p[ p[i][j] ][j],迭代停止的地方p[i][j]=j;
p[i][j]初始话=j;如果ij没有通路i!=j&&p[i][j]=j;
void showpath(int p[][N],int i,int j){
if(i!=j&&p[i][j]=j)cout<<"No Road!"
cout<<i; while(p[i][j]!=j){ cout<<p[i][j]; i=p[i][j]; } cout<<j; cout<<" "; }
1.shortpath_DIJ
void shortpath_DIJ(int g[][N],int n,int key){ int p[N][N]; int final[N]={0},D[N],i,j,minnum,index; for(i=0;i<n;i++)D[i]=g[key][i]; for(i=0;i<n;i++) for(j=0;j<n;j++) p[i][j]=j; final[key]=1; for(i=0;i<n-1;i++){ minnum=INF; for(j=0;j<n;j++){ if(!final[j]&&D[j]<minnum){ minnum=D[j]; index=j; } } final[index]=1; for(j=0;j<n;j++){ if(!final[j]){ if(D[j]>D[index]+g[index][j]){ p[key][j]=index; D[j]=D[index]+g[index][j]; } } } } for(i=0;i<n;i++){//显示路径 if(i!=key){ showpath(p,key,i); } } }
2.shortpath_FLOYD
void shortpath_FLOYD(int g[][N],int n){ int i,j,k; int D[N][N],p[N][N]; for(i=0;i<n;i++){ for(j=0;j<n;j++){ D[i][j]=g[i][j]; p[i][j]=j; } } for(k=0;k<n;k++){ for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(D[i][j]>D[i][k]+D[k][j]){ p[i][j]=k; D[i][j]=D[i][k]+D[k][j]; } } } }
for(i=0;i<n;i++){//显示路径 for(j=0;j<n;j++){ showpath(p,i,j); } cout<<endl; } }
附加测试样例
4 (key=1) 0 3 0 1 0 0 4 0 2 0 0 0 0 0 1 0
stay hungry stay foolish