第K短路(模板)

2022-07-12 03:18:12 字數 1748 閱讀 9136

沒太想明白(就當存在模板吧)

#include#include 

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int maxn = 1e5 + 7

;const

int inf = 1e9 + 7

;int

n, m, k;

intstart, end;

intans;

//最短路部分

intdis[maxn];

bool

vis[maxn];

struct

node

};/*

* a* 啟發式搜尋函式 f[x] = h[x] + g[x]

* 變數 hx 表示搜尋到當前點 所用的代價

* 變數 gx 是估價函式 (估價函式要小於等於實際值,否則出錯) */

struct

edge

};/*

* count 記錄第幾次bfs拓展到此點

* 當 count == k 時 不再對此點繼續進行拓展(因為拓展的點必定大於 第k短路) */

intcount[maxn];

vector

g[maxn], g2[maxn];

/** (因為是有向圖所以反向建圖)

* 求end到每個點的最短路 */

void

dijkstra()

); dis[end] = 0

; node q;

intv, w;

while(!que.empty()));}}

}}/*

* 第k短路演算法 = a* + bfs */

void

astar());

edge q;

intv, hx, gx;

while(!que.empty())

if(count[v] >k)

continue

;

intto, hx, gx;

int _size=g[v].size();

for(int i = 0 ; i < _size ; i++));}

}while(!que.empty())

que.pop();

return;}

intmain());

g2[v].push_back();

}scanf(

"%d %d %d

",&start, &end, &k);

//此題要求start和end相同的時候 第一短路不是0 ,所以k++

if(start ==end)

k++;

dijkstra();

astar();

printf(

"%d\n

",ans);

}return0;

}/*1 12 2 5

2 2 1

*/

view code

第K短路 嚴格第K短路

所謂k短路,就是從s到t的第k短的路,第1短就是最短路。如何求第k短呢?有一種簡單的方法是廣度優先搜尋,記錄t出佇列的次數,當t第k次出佇列時,就是第k短路了。但點數過大時,入佇列的節點過多,時間和空間複雜度都較高。a 是在搜尋中常用的優化,一種啟發式搜尋。簡單的說,它可以用公式表示為f n g n...

K短路 模板

a spfa演算法 1 將有向圖的所有邊正向 反向分別存入兩個不同的邊集 edges,edges1 中。用反向邊集,以所求終點t為源點,利用spfa或dijkstra求解出所有點到t的最短路徑,用dist i 陣列來表示點i到點t的最短距離。2 建立乙個優先佇列,將源點s加入到佇列中。3 從優先佇列...

第K短路(A 演算法)

對於無向圖 spfa a 演算法 先用spfa求目標結點到各個結點的最短路徑 然後,取g x 為從初始結點到當前結點x的路徑長度,h x 為從x結點到目標結點的最短路徑長度,即h x 取dis x 即可,估價函式f x g x h x 對於有向圖 spfa a 演算法 顯然應將有向邊取反,然後求目標...