最短路徑問題-Dijkstra(基於圖的ADT)
阿新 • • 發佈:2018-12-15
遞增 bsp 實現 結構性 cost col width 分享 基於
基於貪心法的單源最短路徑算法
(1)最短路徑問題具有最優子結構性質,即最短路徑的子路徑仍然是最短路徑
(2)最短路徑問題具有貪心選擇性質,為了求的最短路徑,Dijkstra提出以最短路徑長度遞增,逐次生成最短路徑的算法
圖的ADT以及實現詳見:基於相鄰矩陣實現圖的ADT
Dijkstra算法代碼:
1 int minVertex(Graphm* g,int *D){ 2 int i,v; 3 for(int i=0;i<g->n();i++){ 4 if(g->getMark(i)==0){ 5 v=i;break; 6 } 7 } 8 for(i++;i<g->n();i++){ 9 if(g->getMark(i)==0&&(D[i]<D[v]))v=i; 10 } 11 return v; 12 } 13 void Dijkstra(Graphm*g,int *D,int s){ 14 int i,v,w; 15 for(int i=0;i<g->n();i++){ 16 D[i]=INFINITY; 17 }18 D[s]=0; 19 for(int i=0;i<g->n();i++){ 20 v=minVertex(g,D); 21 if(D[v]==INFINITY)return ; 22 g->setMark(v,1); 23 for(w=g->first(v);w<g->n();w=g->next(v,w)){ 24 if(D[w]>(D[v]+g->getEdge(v,w))) 25D[w]=D[v]+g->getEdge(v,w); 26 } 27 } 28 }
性能分析:
通過掃描整個包含|V|個元素的表來搜索最小值
cost:O(|V|^2+|E|)=O(|V|^2)
Dijkstra算法只適合非負權值的圖
最短路徑問題-Dijkstra(基於圖的ADT)