單源點最短路徑 迪傑,優先佇列

2021-10-19 21:41:38 字數 2133 閱讀 7620

總結

1.圖論之一:迪傑特斯拉演算法—聯想(結構體edge, 結構體node,訪問點標記vis,最短距離arr陣列).

貪心策略:先貪目前的最短的路徑,確定下乙個點的最短距離,然後再從目前的確定的路徑中選出最短路徑,依次這樣

所以用到優先佇列.

2.優先佇列(priotity_queue),隊頭top(), 預設排序從大到小. 參考內容

普通佇列(queue) 隊頭front(). 根據先後進隊順序排放。

3.結構體內比較在優先佇列內比較恰恰相反。

單源點最短路徑想法,原理:參考部落格

從出發點開始,與出發點直接相連的頂點進入優先佇列,自動從小到大排序。模板鏈結.

來道題:atcoder beginner contest 192 e題 train

題意: n點(n個城市),m條雙向邊(道路),x出發點,y終點,

一座城市到另一座城市,火車發車時間都有間斷的,在s*ki(s=0,1,2,3,4…)的時刻發車到下乙個城市.車程時間ti。

問從x城市出發,到達y城市需要的最小時間是多少。

思路:顯然是迪傑特斯拉演算法,只不過到了一座城市多了等待火車發車的時間,

從城市出發時間是ki的整數倍:ll ans=(arr[u]+e[u][i].k-1)/e[u][i].k*e[u][i].k+e[u][i].time; 如果ans**如下:

#include

#include

#include

#include

#include

#include

#define ll long long

const

int n=

2e5+10;

const ll mod=

1e9+7;

ll read()

while

(isdigit

(ch)

) s =

(s <<3)

+(s <<1)

+(ch ^48)

, ch =

getchar()

;return s * f;

}using

namespace std;

struct edge};

struct node

node

(int u,ll time)};

vector e[n]

;bool vis[n]

;//點的訪問標記

ll arr[n]

;//儲存到i最短時間

ll dj

(int n,

int x,

int y)

arr[x]=0

; priority_queue q;

node t

(x,0);

q.push

(t);

while

(!q.

empty()

)}}return arr[y];}

int main (

) cout<<

dj(n,x,y)

}

優先佇列與普通佇列的異同:

#include

#include

#include

using

namespace std;

struct node

;struct e

}a[20];

int main (

) cout

"普通佇列u:"

;while

(!u.

empty()

) cout<"sort的排序:"

;sort

(a+1

,a+6+1

);for(

int i=

1;i<=

6;i++

) cout<.r;}

單源點最短路徑

include include include using namespace std 自定義比較大小,負數均視為無窮大,其他大小正常 xbool lessthen float x,float y 長度為len的s陣列是否包含e 包含e,return true bool contain int s,...

單源點最短路徑

單源點最短路徑 雨竹清風 單源最短路徑 是從某乙個源點s出發到圖中的所有的頂點之間的最短路徑。1.單源點最短路徑的變體 1 單終點最短路徑問題 找到從每乙個頂點到終點的最短路徑。可以將圖中的邊全部反向,然後求單源點最短路徑即可。2 單對頂點最短路徑問題 對於圖中的兩個頂點u和v,找到從u到v的最短路...

最短路徑問題(單源點和多源點)

單源點 多源點演算法思想 先初始化距離陣列d inf d 1 0 根據d v min d u w u v d v 對所有的邊進行 鬆弛 值得注意,每一輪鬆弛都會更新至少一條最短路徑,即得到乙個最小的 d i 時間複雜度 o v w bellmanford g,w,s 檢驗是否有負權邊 for u,v...