天天看點

第十三周項目4-floyd算法的驗證

問題及代碼:

頭檔案及功能函數詳見 圖算法庫

main.cpp代碼:

#include "graph.h"  
#define MaxSize 100  
  
void Ppath(int path[][MAXV],int i,int j)  //前向遞歸查找路徑上的頂點  
{  
    int k;  
    k=path[i][j];  
    if (k==-1) return;  //找到了起點則傳回  
    Ppath(path,i,k);    //找頂點i的前一個頂點k  
    printf("%d,",k);  
    Ppath(path,k,j);    //找頂點k的前一個頂點j  
}  
void Dispath(int A[][MAXV],int path[][MAXV],int n)  
{  
    int i,j;  
    for (i=0; i<n; i++)  
        for (j=0; j<n; j++)  
        {  
            if (A[i][j]==INF)  
            {  
                if (i!=j)  
                    printf("從%d到%d沒有路徑\n",i,j);  
            }  
            else  
            {  
                printf("  從%d到%d=>路徑長度:%d 路徑:",i,j,A[i][j]);  
                printf("%d,",i);    //輸出路徑上的起點  
                Ppath(path,i,j);    //輸出路徑上的中間點  
                printf("%d\n",j);   //輸出路徑上的終點  
            }  
        }  
}  
void Floyd(MGraph g)  
{  
    int A[MAXV][MAXV],path[MAXV][MAXV];  
    int i,j,k;  
    for (i=0; i<g.n; i++)  
        for (j=0; j<g.n; j++)  
        {  
            A[i][j]=g.edges[i][j];  
            path[i][j]=-1;  
        }  
    for (k=0; k<g.n; k++)  
    {  
        for (i=0; i<g.n; i++)  
            for (j=0; j<g.n; j++)  
                if (A[i][j]>A[i][k]+A[k][j])  
                {  
                    A[i][j]=A[i][k]+A[k][j];  
                    path[i][j]=k;  
                }  
    }  
    Dispath(A,path,g.n);   //輸出最短路徑  
}  
int main()  
{  
    MGraph g;  
    int A[4][4]=  
    {  
        {0,  15,INF,INF},  
        {10,  0,INF,  6},  
        {INF, 8,  0,  2},  
        {3,  INF, 2,  0}  
    };  
    ArrayToMat(A[0], 4, g);  
    Floyd(g);  
    return 0;  
}  
           

測試用圖:

第十三周項目4-floyd算法的驗證

運作結果截圖:

第十三周項目4-floyd算法的驗證

知識點總結:Floyd算法的驗證。