題意
題目的意思很明確,就是讓你求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 值的點。其意義就是每次找最短的能到終點的點。第一次找到就是最短路徑,第二次就是就是第二短,第三次就是...