1. 程式人生 > >Dijkstra演算法與Floyed程式碼詳解

Dijkstra演算法與Floyed程式碼詳解

一:Dijkstra演算法

詳解程式碼



#define INF 0x3f3f3f

struct node

{

    int L,W;

}Map[MAX][MAX];//用鄰接矩陣表示圖,圖中每個元素含兩個值L,W;L為路徑長度,W為收費情況

int visit[MAX];

int path[MAX]; //儲存路徑長度

int weight[MAX];//儲存收費情況

int Dijkstar(int n,int s,int d)//迪傑斯特拉演算法

{

    int k;

    for(int i=0;i<n;i++)//初始化

    {

        path[i]=Map[s][i].L;//將與S點有連線的頂點初始化其路徑長度,即權值

        weight[i]=Map[s][i].W;//將與0點有連線的頂點加上費用值,也看做權值

    }

    path[s]=0;

    visit[s]=1;

    for(int i=1;i<n;i++)//開始主迴圈,每次求得s到某個n頂點的最短路徑

    {

        int Min = INF;

        for(int j=0;j<n;j++)

        {

            if(!visit[j]&&path[j]<Min)

            {

                k=j;

                Min = path[j];

            }

        }

            visit[k]=1;//將目前找到的最近的頂點置1

 

            for(int i=0;i<n;i++)//修正當前路徑

            {

                if(!visit[i]&&Map[k][i].L<INF)

                {

                    if(path[k]+Map[k][i].L<path[i])//以當前點為起點尋找下一個最短路

                    {

                        path[i]=path[k]+Map[k][i].L;

                        weight[i]=weight[k]+Map[k][i].W;

                    }

                    else if(path[k]+Map[k][i].L==path[i])//若存在相同路徑,則比較相同路徑上費用和的大小,選擇小的存入weight陣列

                    {

                        if(weight[k]+Map[k][i].W<weight[i])

                        {

                            weight[i]=weight[k]+Map[k][i].W;

                        }

                    }

                }

            }

    }

    cout<<path[d]<<" "<<weight[d];

    cout<<endl;

    return 0;

}

 

二:Floyed演算法程式碼詳解



#define INF 0x3f3f3f

struct node

{

    int L,W;

}Map[MAX][MAX];

 

int D[MAX][MAX];//儲存任意兩點間的最短路

int path[MAX][MAX];//儲存要到達頂點的前驅頂點

int weight[MAX][MAX];//儲存任意兩點間的最小費用

 

int Floyed(int n,int s,int d)//Floyed演算法求最短路

{

    for(int i=0;i<n;i++)

    {

        for(int j=0;j<n;j++)

        {

            D[i][j]=Map[i][j].L;

            weight[i][j]=Map[i][j].W;

            path[i][j]=-1;

        }

    }

 

    for(int k=0;k<n;k++)

    {

        for(int i=0;i<n;i++)

        {

            for(int j=0;j<n;j++)

            {

                if(D[i][j]>D[i][k]+D[k][j])

                {

                    D[i][j]=D[i][k]+D[k][j];

                    weight[i][j]=weight[i][k]+weight[k][j];

                    path[i][j]=k;

                }

                else if(D[i][j]==D[i][k]+D[k][j]) //若存在相同路徑,選擇費用較小的一條

                {

                    if(weight[i][j]>weight[i][k]+weight[k][j])

                    {

                        weight[i][j]=weight[i][k]+weight[k][j];

                        path[i][j]=k;

                    }

                }

 

            }

        }

    }

   

    cout<<D[s][d]<<" "<<weight[s][d]<<endl;

    return 0;

}