poj2449 A 演算法求解k短路

2021-07-26 19:43:59 字數 1206 閱讀 3159

今天想到了以前早就遺留下來的乙個演算法–a*演算法,基本上,我對於a*只有過簡單的了解,卻從來沒有具體的寫過 a*,於是就有了今天的a*學習。

a*演算法相比與其他的搜尋來說,它多了乙個估價函式而已。而估價函式在不同的題目中形式又不同,這正是a*難的地方啊~

對於此題:給出n個點,m條邊,可能又重邊,給定起點,終點,求k短路。

k短路是a*的乙個最簡單的應用。

我們可以設計這樣的估價函式:

f(u)=g(u)+h(u).f來代表從s到t的總代價,g為s到u的總代價,h是剩下路徑的總代價。於是我們可以從t跑一遍spfa,來求解出t到每個點的距離,然後將其加入優先佇列中,我們可以知道,k短路即優先佇列中第k個到達t的路徑。

注意:估價函式的估計代價一定比實際代價少,這樣才能是a*滿足條件。

#include

#include

#include

#include

#include

#include

#define for(aa,bb,cc) for(int aa=bb;aa<=cc;++aa)

#define set(aa,bb) memset(aa,bb,sizeof(aa))

using namespace std;

const int maxn=100010,maxm=1010,inf=0x3f3f3f3f;

int be[maxn],ne[maxn],to[maxn],w[maxn],e;

int revbe[maxn],revne[maxn],revto[maxn],revw[maxn],reve;

int dis[maxm];

bool vis[maxn];

int n,m,s,t,k;

struct astar

};void add(int

x,int

y,int z)

void spfa(int node)}}

}}int a_star(int l,int r)

for(int i=be[ls.p];i;i=ne[i])

}return -1;

}void work()

scanf("%d

%d%d",&s,&t,&k);

spfa(t);

printf("%d\n",a_star(s,t));

}int main()

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 就是當前...

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

題目描述 給定乙個帶權有向圖,詢問從起點到終點第k短路徑長度,如果沒有則輸出 1。這個題目資料有特殊之處,就是如果起點與終點重合時,距離0並不算第一短最短路徑。a 演算法 使用估值函式來進行搜尋,f n g n h n 其中f n 表示狀態起點經過狀態n到狀態終點的估值,g n 為狀態起點到狀態n的...