poj2449 第k短路 (單源最短路徑 A )

2021-08-05 19:18:43 字數 1360 閱讀 1988

題意

題目的意思很明確,就是讓你求s到t的第k短路。不過有乙個trick點就是必須要經過路徑,也就是說如果s=t的話,在算第k短路時不能算s到t為0這條路。

題解 基本就是裸的第k短路,而第k短路是單源最短路和a*演算法的組合。對於a*演算法,都知道f(n)=g(n)+h(n),這裡h(n)為啟發式函式。我們令這裡的g(n)為從源點s到n所經過的路徑,h(n)為把所有邊反向後從終點t到n的最短路徑dist[n]。即估值=源點到當前點的距離+當前點到終點的最短距離。這時我們建乙個優先佇列,每次彈出估值f()最小的點,如果彈出的點是t就計算t出隊的次數,如果次數等於k,那麼到當前點的距離g()即為答案,否者就拓展與當前點相連的邊。

#include 

#include

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f

typedef

long

long ll;

const

int maxn = 1e3+5;

const

int maxm = 1e5+5;

int n,m,s,t,k,ans;

//前向星儲存邊

int head[maxn],a_head[maxn],cnt1,cnt2;

//dist儲存終點到其它點的最短路

int dist[maxn];

struct edgeedge1[maxm],edge2[maxm];

struct a_node

};typedef pair p;

void init()

void add_edge(int from,int to,int w,bool flag)

else

}void dijkstra() //優先佇列優化的dijkstra求終點到其它點的最短路}}

}void a_stra()

cur.p = s;

cur.g = 0;

cur.h = dist[s];

pq.push(cur);

while(!pq.empty())

for(int i=a_head[cur.p];i!=-1;i=edge2[i].next)

}ans = -1;

return;

}int main()

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

dijkstra();

a_stra();

printf("%d\n",ans);

}return

0;}

POJ 2449 第K短路 A 演算法

給定一張n個點,m條邊的有向圖,求從起點到終點t的第k短路的長度。求第k短路,我們先回憶一下dijkstra求最短路的方法。每次鬆弛了乙個節點,則將該節點放入優先佇列,然後在取優先佇列的第乙個點,即源點到該點距離最短的點,再用該點去鬆弛其他的點。最終求出的距離就是單源最短距離。換句話說,就是用優先佇...

POJ 2449 求第K短路

第一道第k短路的題目 qaq 拿裸的dijkstra 不斷擴充套件的a 給2000ms過了 題意 大意是 有n個station 要求從s點到t點 的第k短路 不過我看題意說的好像是從t到s 可能是出題人寫錯了 從這題中還真的學到了很多 1.第k短路的演算法 a 還有用邊表實現dij 注 以下部份資料...

poj 2449 第k短路徑

思路 利用乙個估計函式g i dis i len。其中len為佇列出來的點當前已經走了的距離。dis i 為該點到終點的最短路徑。這樣我們只要將點按g i 的公升序在佇列你排序,每次取出最小的g i 值的點。其意義就是每次找最短的能到終點的點。第一次找到就是最短路徑,第二次就是就是第二短,第三次就是...