#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
(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