Dijkstra 迪傑斯特拉

2021-09-14 00:50:42 字數 2329 閱讀 4007

1)演算法思想:

設g=(v,e)是乙個帶權有向圖,把圖中頂點集合v分成兩組

第一組為已求出最短路徑的頂點集合

(用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 , 就將加入到 集合s中,直到全部頂點都加入到s中,演算法就結束了)

第二組為其餘未確定最短路徑的頂點集合(用u表示)

按最短路徑長度的遞增次序依次把第二組的頂點加入s中。在加入的過程中,總保持從源點v到s中各頂點的最短路徑長度不大於從源點v到u中任何頂點的最短路徑長度。此外,每個頂點對應乙個距離,s中的頂點的距離就是從v到此頂點的最短路徑長度,u中的頂點的距離,是從v到此頂點只包括s中的頂點為中間頂點的當前最短路徑長度。

按最短路徑長度的遞增次序依次把第二組的頂點加入s中。在加入的過程中,總保持從源點v到s中各頂點的最短路徑長度不大於從源點v到u中任何頂點的最短路徑長度

為什麼dijkstra 演算法不適用於帶負權的圖?

當把乙個點選入集合s時,就意味著已經找到了從a到這個點的最短路徑,比如第二步,把c點選入集合s,這時已經找到a到c的最短路徑了,但是如果圖中存在負權邊,就不能再這樣說了。舉個例子,假設有乙個點z,z只與a和c有連線,從a到z的權為50,從z到c的權為-49,現在a到c的最短路徑顯然是

a --> z --> c

#include

#include

#include

#include

#include

#include

#include

#include

#include<

set>

#include

#define pi acos(-

1)#define mxan

#define max3

(a,b,c)

max(a,

max(b,c)

)#define min3

(a,b,c)

min(a,

min(b,c)

)#define mod 1000000009

#define inf

0x3f3f3f3f

#define pi acos(-

1.0)

#define eps 1e-6

#define lson rt<<

1,l,mid

#define rson rt<<1|

1,mid+1,r

#define fre

(i,a,b)

for(i = a; i <= b; i++

)#define frl

(i,a,b)

for(i = a; i < b; i++

)#define mem

(t,v)

memset

((t)

, v,

sizeof

(t))

#define sf

(n)scanf

("%d"

,&n)

#define sff

(a,b)

scanf

("%d %d"

,&a,

&b)#define sfff

(a,b,c)

scanf

("%d %d %d"

,&a,

&b,&c)

#define pf printf

using namespace std;

typedef long long ll;

const int n

=1e6+5

;const ll in

=1e18

;const int maxn=

1020

;int dis[maxn]

,value[maxn]

;int vis[maxn]

;//記錄是否詢問

struct edge

h;struct cmp};

int main()

cin>>s>>t;

dis[s]=0

;value[s]=0

; h.

from

=s,h.to=s,h.val=

0,h.pen=0;

q.push

(h);

while(!

q.empty()

)else

if(dis[y.to]

==dis[x.to]

+y.val&&value[y.to]

>value[x.to]

+y.pen)}}

cout<<<

" "<<}}

迪傑斯特拉 Dijkstra

參考 迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。大概就是這樣乙個有權圖,dijkstra演算法可以計算任意節點到其他節點的最短路徑 演算法思路 指定乙個節點,...

Dijkstra(迪傑斯特拉)演算法

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

迪傑斯特拉 dijkstra 筆記

dijkstra演算法是用來解決有權圖 無負權 中的最短路問題。過程 首先我們初始化乙個陣列dis tdist dist 將其所有值初始化為無窮,dis t i dist i dist i 表示到i ii點的最短距離。然後我們把所有的節點分到兩個集合s與v中,s集合表示已確定最短路的節點的集合,v表...