1. 程式人生 > >最短路徑問題-Dijkstra(基於圖的ADT)

最短路徑問題-Dijkstra(基於圖的ADT)

遞增 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))) 25
D[w]=D[v]+g->getEdge(v,w); 26 } 27 } 28 }

性能分析:

通過掃描整個包含|V|個元素的表來搜索最小值

cost:O(|V|^2+|E|)=O(|V|^2)

Dijkstra算法只適合非負權值的圖

最短路徑問題-Dijkstra(基於圖的ADT)