注意:
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中,直到全部...