dijkstra演算法是用來解決有權圖(無負權)中的最短路問題。
過程:首先我們初始化乙個陣列dis
tdist
dist
將其所有值初始化為無窮,dis
t[i]
dist[i]
dist[i
]表示到i
ii點的最短距離。
然後我們把所有的節點分到兩個集合s與v中,s集合表示已確定最短路的節點的集合,v表示未確定最短路的節點的集合。
1.從起點出發到起點(設為x)的距離是0所以可以確定x一定位於s中
2.接下來我們從起點開始,遍歷x所能到達的下乙個點(設為y),並算出從起點到達這個點的距離並更新dis
tdist
dist
(由於要算的是最短路所以更新的法則是取最小值即dis
t[y]
=min
(dis
t[y]
,dis
t[x]
+len
)dist[y] = min(dist[y],dist[x] + len)
dist[y
]=mi
n(di
st[y
],di
st[x
]+le
n)len是x到y的距離)
3.更新完之後接下,來我們把v中dis
tdist
dist
最小的乙個拉出來,並且加入s然後將其當做x,重複2,3直到v為空。
證明:本人能力有限,希望將來有一天我能將其補上。
板子題
**(樸素版)
#include
#define inf 0x3f3f3f3f
using
namespace std;
typedef
long
long ll;
const ll maxn =
1e3+5;
int graph[maxn]
[maxn]
,m,n;
//dist[i]表示起點到第i個節點的最短距離
//book[i]表示i是否已經確定最小距離
int dist[maxn]
,book[maxn]
;int
dijkstra()
if(dist[n]
!= inf)
return dist[n]
;else
return-1
;}intmain()
cout <<
dijkstra()
<< endl;
return0;
}
堆優化版
這裡可以用乙個優先佇列來代替。每次我們更新的點都是最小的,而每次查詢最小值都需要遍歷查詢,所以我們可以把當前已更新的點放在優先佇列中;
**(堆優化版)
原題
#include
#define eps 1e-8
#define ll long long
#define inf 0x3f3f3f3f
using
namespace std;
//(距離,點)
typedef pair<
int,
int> node;
const ll maxn =
1e6+5;
const ll mod =
1e9+7;
ll h[maxn]
,w[maxn]
,e[maxn]
,nex[maxn]
,cnt =1;
ll n,m,dist[maxn]
,book[maxn]
;void
add(ll from, ll to, ll wth)
void
dijkstra()
);while
(qu.
size()
));}
}}}int
main()
dijkstra()
;if(dist[n]
== inf)
cout <<-1
<< endl;
else
cout << dist[n]
<< endl;
return0;
}
迪傑斯特拉 Dijkstra
參考 迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。大概就是這樣乙個有權圖,dijkstra演算法可以計算任意節點到其他節點的最短路徑 演算法思路 指定乙個節點,...
Dijkstra 迪傑斯特拉
1 演算法思想 設g v,e 是乙個帶權有向圖,把圖中頂點集合v分成兩組 第一組為已求出最短路徑的頂點集合 用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 就將加入到 集合s中,直到全部頂點都加入到s中,演算法就結束了 第二組為其餘未確定最短路徑的頂點集合 用u表示 按最短路徑長度的遞增次...
Dijkstra(迪傑斯特拉)演算法
迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...