Dijkstra 單源最短路徑

2021-08-10 21:39:49 字數 1378 閱讀 8791

/*

dijkstra演算法:

1.將所有的頂點分為兩部分:已知最短路程的頂點集合p未知最短路徑的頂點集合q

最開始,已知最短路徑的定點集合p中只有源點乙個頂點。用

visit陣列記錄哪些頂點在p中。

對於某個頂點i,如果

visit[i]為1則表示此頂點在p中,若visit[i]為0,則表示此頂點在集合q中

2.設定源點v到自己的最短路徑為0,即dis[v]=0。若存在源點能直接到達的頂點i,則把dis[i]設為e[v][i]

同時把所有其他(源點不能直接到達的)頂點的最短路徑設為inf(無窮大)

3.在集合q中所有的頂點中選擇乙個離源點v最近的頂點u(即dis[u]最小),加入到集合p

並考察所有以u為起點的邊,對每一條邊進行鬆弛操作。

如果存在一條從u到s的邊,可以通過將邊u->s新增到尾部來拓展一條從v到s的路徑,這條路徑的長度是dis[u]+e[u][s].

如果這個值比目前已知的dis[s]的值要小,則可以用新值來替代當前dis[s]中的值。

4.重複第3步,直到集合q為空,演算法結束。最終dis陣列中的值就是源點到所有頂點的完整路徑。 

#include#define maxnum 100

#define inf 999999

using namespace std;

void dijkstra(int n,int v,int *dis,int *prev,int c[maxnum][maxnum])

dis[v]=0;

visit[v]=1;

for(int i=2;i<=n;i++){

int min=inf;

int u=v;

//找出當前未使用點j的dis[j]最小值

for(int j=1;j<=n;j++)

if(!visit[j]&&dis[j]=1;i--){

if(i!=1)

cout<";

else

cout<>n;

cin>>m;

int p,q,w;

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

c[i][j]=inf;

for(int i=1;i<=m;i++){

cin>>p>>q>>w;

if(w

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra單源最短路徑

dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...