K短路 學習筆記

2022-03-26 10:51:38 字數 1400 閱讀 7330

k短路,顧名思義,是讓你求從$s$到$t$的第$k$短的路。

暴力當然不可取,那麼我們有什麼演算法可以解決這個問題?

首先,我們要維護乙個堆。

struct

node

}priority_queue

q;

這個堆是用來幹什麼的?

這時候要提到一種新演算法:a*演算法。

估價函式:$f[i]=g[i]+h[i]$。其中,$g[i]$是從起點$s$走,按照這條路徑到當前點已經走了多少路程,$h[i]$是當前點到終點$t$的最短路。

我們用之前開設的堆來維護這個估價函式,這樣到達第k次終點$t$的路徑即為所求。

code(這裡是[sdoi2010]魔法豬學院的a*演算法):

void astar(int

kk)

if (vis[now]>kk) continue

;

for (int i=head[now];i;i=edge[i].next)

}}

每個點到終點$t$的最短路怎麼求?很簡單,我們只要在建圖的時候再建乙個反向圖,從終點跑單源最短路徑即可。

code:

void

spfa()}}

}

例題:[usaco08mar]cow jogging g

近乎於k短路的裸題,只需要注意$u$大於$v$即可。

#include#define int long long

using

namespace

std;

const

int maxn=1005

;const

int maxm=20005

;int

dis[maxn],vis[maxn];

intn,m,k;

struct

skt

};skt x;

struct

node

edge[maxm],cont[maxm];

intheade[maxm],headc[maxm],cnt;

inline

void add(int

from,int to,int

dis)

inline

intread()

while(isdigit(ch))

return x*f;

}void

spfa()}}

}void

astar()}}

while(ans1

return;}

signed main()

spfa();

astar();

return0;

}

學習筆記 k短路

a 我已經忘了怎麼寫了,反正n 30,m 1000都能卡掉。正解 可持久化左偏樹 堆維護可能集合 原 概括 結論 1.t為根求最短路樹t,定義p 為路徑s t的路徑p和t沒有交集的部分,p 和p都是有序邊集 對於p 中相鄰邊一定存在tail和head的祖先後代關係 或者重合 2.新定義邊的代價 di...

筆記 K短路

一.定義 從起點 出發到達目標 的第 小的路徑 二.樸素演算法 直接bfs 帶優先佇列 當目標節點 第 次出佇列時,即為所求 解釋 bfs第一次搜到 點時,即為最短距離,那麼當第二次搜到呢?不用說,是次短路 rt.次短路 節點 距離 1 6 出佇列 佇列內元素 1 0 2 7 3 9 6 14 2 ...

更新 學習筆記 凸包 K短路

這週cyc的套題裡出現了兩個新的演算法,乙個是計算幾何之凸包,還有乙個是最短路擴充套件之k短路,在此做乙個 凸包專題 那麼構建凸包之後我們相當於用最短的長度將平面內所有的點包圍起來 兩點之間線段最短 對於乙個凸包,我們從它的原點 即圖中紅點 向點集中的中間點 圖中點6 連一根線,會將凸包分成兩個凸狀...