最短路徑算法(Dijkstra)學習筆記

 

#include<iostream>
#include<cstdlib>
using namespace std;
#define VEX  5//定義結點的個數
#define maxpoint 100

double graph[][maxpoint]=
{
    { 0 , 10 , -1 , 30 , 100 },
    { -1 , 0 , 50 , -1 , -1 } ,
    { -1 , -1 , 0 , -1 , 10 } ,
    { -1 , -1 , 20 , 0 , 60 } ,
    { -1 , -1 , -1 , -1 , 0 }
}; //鄰接矩陣
int i,j;
int main()
{
    int R[maxpoint]= {0},B[maxpoint];
    int D[VEX],P[VEX];//定義數組D用來存放結點特殊距離,P數組存放父親結點
//初始時,紅點集中僅有源結點0
    R[0]=1;
    B[0]=0;
    for(int i=1; i<VEX; i++)
        B[i]=1;

//對數組D、P進行初始化
    for(i=0; i<VEX; i++)
    {
        D[i]=graph[0][i];
        if(D[i]!=-1) P[i]=0;
        else P[i]=-1;
    }
//輸出鄰接矩陣
    for(i=0; i<VEX; i++)
    {
        for(int j=0; j<VEX; j++)
            cout<<graph[i][j]<<"\t";
        cout<<endl;
    }
//輸出D、P表頭
    cout<<"      ";
    for(i=0; i<VEX; i++)
        cout<<"D["<<i<<"]   ";
    cout<<"   ";
    for(i=0; i<VEX; i++)
        cout<<"P["<<i<<"]   ";
    cout<<endl;

    for(int k=1; k<VEX; k++) //每次從藍點集中取出具備最短特殊路長度的結點min
    {
        int MIN;
        for(MIN=0; B[MIN]==0;)
            MIN++; //求藍點集結點最小下標元素
        for(int j=MIN; j<VEX; j++)
            if(D[j]!=-1&&D[j]<D[MIN]&&B[j]==1)  MIN=j;
        cout<<"MIN="<<MIN<<"  ";
//將具備最短特殊路長度的結點添加到紅點集中
        R[MIN]=1;
        B[MIN]=0;
        //對數組D做必要的修改
        for(j=1; j<VEX; j++)
            if(graph[MIN][j]!=-1&&MIN!=j)  //結點min到j間有路
                if(D[j]>D[MIN]+graph[MIN][j]||D[j]==-1)
                {
                    D[j]=D[MIN]+graph[MIN][j];   //每次迭代求最小值,最後一次即爲到源點的最短路徑
                    P[j]=MIN;
                }

//輸出最短路徑
        for(i=0; i<VEX; i++)
            cout<<D[i]<<"     ";
        cout<<"   ";
        for(i=0; i<VEX; i++)
            cout<<P[i]<<"     ";
        cout<<endl;
    }
}

 

 

Dijkstra算法ios

 

ØDijkstra算法是解單源最短路徑問題的貪心算法。

 

Ø基本思想:設置頂點集合S並不斷地做貪心選擇來擴充這個集合。一個頂點屬於集合S當且僅當從源到該頂點的最短路徑長度已知。

 

(1)初始時,S中僅含有源節點。算法

 

(2)設u是G的某一個頂點,把從源到u且中間只通過S中頂點的路稱爲從源到u的特殊路徑,用數組D[i]記錄頂點i當前所對應的最短特殊路徑長度。數組

 

(3)Dijkstra算法每次從V-S中取出具備最短特殊路長度的頂點u,將u添加到S中,同時對數組D做必要的修改。spa

 

(4)一旦S包含了全部V中頂點,dist就記錄了從源到全部其它頂點之間的最短路徑長度。code

 

Dijkstra算法基本思想blog

 

Ø設S爲最短距離已肯定的頂點集(紅點集)

 

ØV-S是最短距離還沒有肯定的頂點集(藍點集)。
①初始化
 最初只有源點s的最短距離是已知的(D(s)=0),故紅點集S={s} 。
②重複如下工做,按路徑長度遞增次序產生各頂點最短路徑
   在當前藍點集中選擇一個最短距離最小的藍點來擴充紅點集,以保證算法按路徑長度遞增的次序產生各頂點的最短路徑。
    當藍點集中僅剩下最短距離爲∞的藍點,或者全部藍點已擴充到紅點集時,s到全部頂點的最短路徑就求出來了。
 
一個實例

 

相關文章
相關標籤/搜索