Dijkstra演算法(單源最短路徑)

2021-07-31 12:12:44 字數 1781 閱讀 3079

dijkstra演算法(單源最短路徑)

單源最短路徑問題,即在圖中求出給定頂點到其它任一頂點的最短路徑。在弄清楚如何求算單源最短路徑問題之前,必須弄清楚最短路徑的最優子結構性質。

一.最短路徑的最優子結構性質

該性質描述為:如果p(i,j)=是從頂點i到j的最短路徑,k和s是這條路徑上的乙個中間頂點,那麼p(k,s)必定是從k到s的最短路徑。下面證明該性質的正確性。

假設p(i,j)=是從頂點i到j的最短路徑,則有p(i,j)=p(i,k)+p(k,s)+p(s,j)。而p(k,s)不是從k到s的最短距離,那麼必定存在另一條從k到s的最短路徑p'(k,s),那麼p'(i,j)=p(i,k)+p'(k,s)+p(s,j)二.dijkstra演算法

由上述性質可知,如果存在一條從i到j的最短路徑(vi.....vk,vj),vk是vj前面的一頂點。那麼(vi...vk)也必定是從i到k的最短路徑。為了求出最短路徑,dijkstra就提出了以最短路徑長度遞增,逐次生成最短路徑的演算法。譬如對於源頂點v0,首先選擇其直接相鄰的頂點中長度最短的頂點vi,那麼當前已知可得從v0到達vj頂點的最短距離dist[j]=min。根據這種思路,

假設存在g=,源頂點為v0,u=,dist[i]記錄v0到i的最短距離,path[i]記錄從v0到i路徑上的i前面的乙個頂點。

1.從v-u中選擇使dist[i]值最小的頂點i,將i加入到u中;

2.更新與i直接相鄰頂點的dist值。(dist[j]=min)

3.知道u=v,停止。

**實現:

/*

dijkstra求單源最短路徑 2010.8.26

*/#include

#include

#define m 100

#define n 100

using

namespace

std;

typedef

struct

node

mgraph;

void dijkstrapath(mgraph g,int *dist,int *path,int v0) //

v0表示源頂點

else

visited[i]=false

; path[v0]=v0;

dist[v0]=0

; }

visited[v0]=true

;

for(i=1;i//

迴圈擴充套件n-1次

} visited[u]=true

;

for(k=0;k//

更新dist陣列的值和路徑的值

}

}

}void showpath(int *path,int v,int v0) //

列印最短路徑上的各個頂點

s.push(v);

while(!s.empty())

} int main(int argc, char *argv)

cin>>v0; //

輸入源頂點

dijkstrapath(g,dist,path,v0);

for(i=0;i)}}

return0;

}

測試資料:

執行結果:

單源最短路 Dijkstra演算法

前提 沒有負邊 如果有負邊,可以用此方法檢查是否有負圈 const max v max v 表示邊的權重值 d max v 儲存從起點到每個點的總權重值 bool used max v 表示當前點是否已經訪問完畢 思想 找到乙個已經確定最短距離的點,更新跟它相鄰的點,之後這個點就不用關心了。起點最短...

單源最短路演算法 Dijkstra

dijkstra演算法是單源最短路演算法,可以求解不帶負權邊的圖中,從源點s到其它所有點的最短路。時間複雜度近似o n 2 可以用堆優化。一般用鄰接表,也可用鄰接矩陣。在稠密圖上會有較好的效能表現。include include using namespace std int s,t,n,m,las...

單源最短路 Dijkstra演算法

本文 自王陸的文字,僅作學習使用。dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。問題描述 在無向圖 g v,e 中,假設每條邊 e i 的長度為 w i 找到由頂點 v0 到...