k短路,顧名思義,是讓你求從$s$到$t$的第$k$短的路。
暴力當然不可取,那麼我們有什麼演算法可以解決這個問題?
首先,我們要維護乙個堆。
structnode
}priority_queue
q;
這個堆是用來幹什麼的?
這時候要提到一種新演算法:a*演算法。
估價函式:$f[i]=g[i]+h[i]$。其中,$g[i]$是從起點$s$走,按照這條路徑到當前點已經走了多少路程,$h[i]$是當前點到終點$t$的最短路。
我們用之前開設的堆來維護這個估價函式,這樣到達第k次終點$t$的路徑即為所求。
code(這裡是[sdoi2010]魔法豬學院的a*演算法):
void astar(intkk)
if (vis[now]>kk) continue
;
for (int i=head[now];i;i=edge[i].next)
}}
每個點到終點$t$的最短路怎麼求?很簡單,我們只要在建圖的時候再建乙個反向圖,從終點跑單源最短路徑即可。
code:
voidspfa()}}
}
例題:[usaco08mar]cow jogging g
近乎於k短路的裸題,只需要注意$u$大於$v$即可。
#include#define int long longusing
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 連一根線,會將凸包分成兩個凸狀...