總結:單源點最短路徑想法,原理:參考部落格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...