dijkstra迪傑斯特拉演算法

2021-10-04 13:46:33 字數 2316 閱讀 4439

注意:

1.標頭檔案climits的int_max,加上2整數會溢位,每次相加前得判斷被加值是否為int_max,int_max+10為負數

2.得先初始化再對d[s],c[s],g,cost等賦值

fill

(&d[0]

,&d[0]

+max, int_max)

;fill

(&g[0]

[0],

&g[0][

0]+max*max, int_max)

;

3.visit[j]==false

鄰接矩陣儲存圖

#include

#include

//int_max

using

namespace std;

const

int max =20;

//最大頂點個數

bool visit[max]=;

int g[max]

[max]

;int d[max]

;int vn, en, s;

//頂點數、邊數、起點下標

int pre[max]

;//存放前驅結點的下標

void

dijkstra

(int s)}if

(-1== idx)

return

;else

visit[idx]

=true

;//對還未確定結果的結點,以j為中間結點更新

for(

int k=

0; k

}}//起點到終點的路徑,很容易理解這個遞迴

void

dfs(

int s,

int e)

dfs(s,pre[e]);

cout<

" ";

}int

main()

dijkstra

(s);

//輸出d

for(

int i=

0; i

)//求解路徑

第二尺度

/**

*帶第二尺度的迪傑斯特拉演算法

*存在多條最短路徑時,選擇第二尺度最大/最小的那條

*第二尺度為邊權、點權,或僅求最短路徑條數

此例求邊權(花費)最短

*/#include

#include

//int_max

using

namespace std;

const

int max =20;

int g[max]

[max]

;bool visit[max]=;

int pre[max]

;//前驅

int d[max]

;//存放最優距離

int vn, en, s, e;

//頂點數、邊數、起點終點

int cost[max]

[max]

;//存放邊權

int c[max]

;//存放最優邊權

void

dijkstra

(int s)}if

(-1== idx)

return

;else

visit[idx]

=true

;//確定到達idx的最短距離

//優化

for(

int k=

0; k

)else

if(d[idx]

+g[idx]

[k]== d[k])}

}}}}

void

dfs(

int v)

dfs(pre[v]);

cout<

" ";

}int

main()

dijkstra

(s);

dfs(e)

; cout<

"最短距離:"

<

<

cout<<

"最小花費:"

Dijkstra(迪傑斯特拉)演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...

迪傑斯特拉 Dijkstra 演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。通過dijkstra計算圖g中的最短路徑時,需要指定起點s 即從頂點s開始計算 dijkstra演算法算是貪心思想實...

Dijkstra迪傑斯特拉演算法

作用 用於對有權圖進行搜尋,找出圖中兩點的最短距離 或一點到其他所有點的最短距離 ps 這一大段我看著也費勁 演算法思想 設g v,e 是乙個帶權有向圖,把圖中頂點集合v分成兩組,第一組為已求出最短路徑的頂點集合 用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 就將加入到集合s中,直到全部...