計算機演算法設計與分析 (四) 貪心演算法--單源最短路徑
阿新 • • 發佈:2018-12-17
1.Dijkstra演算法是解決單源最短路徑的一個貪心演算法。給定一個帶權有向圖G=(V,E),其中每條邊的權都是非負實數,另外,還給定V中的一個頂點,稱為源。現在要計算源到其他各個頂點的最短路長度。這裡的路的長度指的是路上各邊權之和。
Dijkstra演算法可描述如下,其中輸入的帶權有向圖是G=(V,E),頂點v是源。c是一個二維陣列,c[i][j]表示邊(i,j)的權。當(i,j)之間無直接的邊連線時,c[i][j]是一個大數。dist[i]表示當前從源點到頂點i的最短特殊路徑長度。
template<class Type> void Dijkstra(int n, int v,Type dist[][],int prev[],Type **c) { bool s[n+1]; for(int i=1;i<=n;++i) { dist[i]=c[v][i]; s[i]=false; if(dist[i]==Int_Max) prev[i]=0; else prev[i]=v; } dist[v]=0; s[v]=true; for(int i=1;i<n;++i) { int temp =maxint; int u=v; for(int i=1;i<n;i++) { if(dist[j]<temp&&!s[i])//選出當前剩餘點中距離v最近的點 { u=j; temp=dist[j]; } } s[u]=true for(int j=1;j<=n;++j)//更新dist陣列 { if(!s[i]&&c[u][j]+dist[u]<dist[j]) { dist[j]=c[u][j]+dist[u]; prev[j]=u; } } } }
演算法的正確性和複雜性
1)貪心選擇性質
dijkstra演算法所做的貪心選擇是從V-S中選擇具有最短特殊路徑的頂點u,從而確定源到u的最短路徑長度
2)最優子結構
不論演算法中dist[u]是否變化,它總是關於當前頂點集S到v的特殊最短路徑長度