POJ 2449 A 演算法與最短路演算法

2021-07-15 04:45:39 字數 1095 閱讀 8246

題目描述:給定乙個帶權有向圖,詢問從起點到終點第k短路徑長度,如果沒有則輸出-1。這個題目資料有特殊之處,就是如果起點與終點重合時,距離0並不算第一短最短路徑。

a*演算法:使用估值函式來進行搜尋,f(n)=g(n)+h(n),其中f(n)表示狀態起點經過狀態n到狀態終點的估值,g(n)為狀態起點到狀態n的距離值,h(n)為狀態n到狀態終點的距離值。之所以說f(n)是估值函式是因為,h(n)通常不是準確值而是估計值。該題的狀態是(u,g,f)其中u表示當前在點u,且從狀態起點到此狀態的距離值為g,f是通過dis(u)+g計算得到。

其中dis(u)為點u到終點的最短距離。

每次擴充套件時使用f最小的狀態。搜尋時出現第k次終點t時,就能得出答案。

簡單證明:f值最小即g+dis(u)最小,則當第一次出現終點t時,就是從起點到終點的最短路徑。當捨棄最短路徑後,繼續擴充套件狀態,可以想到當第二次出現終點t時,就是從起點到終點的第二短路徑,所以可以求出第k小最短路徑。

**如下:

#include #include #include #include #include using namespace std;

const int maxn=1005;

const int maxe=100005;

struct state

};struct edgeedge[maxe],reedge[maxe];

int head[maxn],rehead[maxn];

int dis[maxn],vis[maxn];

int n,m;

int cot;

int s,t,k;

void init()

void addedge(int u,int v,int w)

void spfa()}}

vis[u]=false;

}}int astart()

for(int i=head[b.u];~i;i=edge[i].ne)

}return -1;

}int main()

{ int u,v,w;

while(scanf("%d %d",&n,&m)==2){

init();

for(int i=0;i

poj2449 A 演算法求解k短路

今天想到了以前早就遺留下來的乙個演算法 a 演算法,基本上,我對於a 只有過簡單的了解,卻從來沒有具體的寫過 a 於是就有了今天的a 學習。a 演算法相比與其他的搜尋來說,它多了乙個估價函式而已。而估價函式在不同的題目中形式又不同,這正是a 難的地方啊 對於此題 給出n個點,m條邊,可能又重邊,給定...

POJ2449 A 演算法 第k短路

題意 傳送門 原題目描述在最下面。給你乙個有向圖,求指定節點間的第k短路。先反向跑出從終點開始的到每個節點的最短距離。樂觀估計函式f n g n h n f n g n h n g n g n 表示到當前狀態跑的距離,h n h n 表示到目標狀態還需要的距離。對於a a 然後跑一遍bf s bfs...

POJ 2449 A 初步 K短路

原以為a 會很難懂 結果狐狸大大一口氣就給我講懂了a 和k短路的求法.所謂a 就是啟發是搜尋.說白了就是給bfs搜尋乙個順序使得搜尋更加合理減少無謂的搜尋.如何來確定搜尋的順序?也就是用乙個值來表示這個值為f x 每次搜尋取f x 最小的拓展.那麼這個f x h x g x 其中這個h x 就是當前...