從乙個點s到t的第k短的路徑。
我以前只會打從乙個點到另乙個點的最短路徑。
後來去看了看k短路徑的求法。
a_star演算法
設估價函式g[
i]=f
[i]+
p[i]
,f[i
] 表示i到t的最短路徑的長度,p[
i]表示s到i目前走得距離。
首先,我們把原圖的邊全部反向連邊。然後求出所有的點到t的最短路徑。
然後,我們把s丟進堆裡面,堆的判斷大小條件以g為第一關鍵字,f為第二關鍵字。
每次取出堆頂a,把它彈出去,如果彈出去的是t,那麼cnt++(表示找到了第cnt短路),如果cnt=k,那麼就退出 。
把與a向連的點,計入f和g,丟進堆裡面。
這樣就可以了。
poj2249
code
#include
#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
#define rep(i,a) for(i=first[a];i;i=next[i])
#define rep1(i,a) for(i=first1[a];i;i=next1[i])
using
namespace
std;
const
int maxn=200007;
int i,j,k,l,n,m,ans,x,y,z,ss,tt;
int first[maxn],last[maxn],next[maxn],chang[maxn],num;
int first1[maxn],last1[maxn],next1[maxn],chang1[maxn],num1;
int d[maxn],data[maxn*10];
bool bz[maxn];
struct node
void add1(int x,int y,int z)
void spfa(int x)}}
bz[now]=0;
}}void a_star()
rep(i,p.a)
}}int main()
scanf("%d%d%d",&ss,&tt,&k);
ans=-1;
spfa(tt);
a_star();
printf("%d\n",ans);
}
第K短路 嚴格第K短路
所謂k短路,就是從s到t的第k短的路,第1短就是最短路。如何求第k短呢?有一種簡單的方法是廣度優先搜尋,記錄t出佇列的次數,當t第k次出佇列時,就是第k短路了。但點數過大時,入佇列的節點過多,時間和空間複雜度都較高。a 是在搜尋中常用的優化,一種啟發式搜尋。簡單的說,它可以用公式表示為f n g n...
第K短路(A 演算法)
對於無向圖 spfa a 演算法 先用spfa求目標結點到各個結點的最短路徑 然後,取g x 為從初始結點到當前結點x的路徑長度,h x 為從x結點到目標結點的最短路徑長度,即h x 取dis x 即可,估價函式f x g x h x 對於有向圖 spfa a 演算法 顯然應將有向邊取反,然後求目標...
第k短路和A
第一次接觸a 感覺好神奇。啟發函式 f x g x h x 比如初始狀態為s,目標狀態為t g x 表示從s到達狀態x所消耗的代價 h x 表示從x到達t所估算的代價 g x 表示s x可能出現的最小代價 h x 表示x t可能出現的最小代價 g x g x h x h x 好吧,上面全是概念。當g...