第k短路的求法

2021-07-24 08:09:09 字數 1311 閱讀 1936

從乙個點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...