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

 

posted @ 2020-11-03 21:31  金龙喩  阅读(96)  评论(0编辑  收藏  举报