題目鏈結
題意:求乙個有向圖的k
kk短路長度。
思路:經典問題的經典演算法——a∗a*
a∗搜尋。感覺a∗a*
a∗搜尋和dij
kstr
adijkstra
dijkst
ra堆優化寫法有很多類似的地方。
首先以每個點到終點的最短距離作為估計函式g
gg,故先需要反向建圖,隨後對反圖從終點t
tt做一遍dij
kstr
adijkstra
dijkst
ra。隨後從起點開始a∗a*
a∗搜尋,第k
kk個搜尋到的值即為第k
kk短路長度。
另外注意當s==
ts == t
s==t
時,k
kk需要加1
11,因為必須經過至少一條路徑。
此題得解。
**:
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int inf =
1e8+10;
const
int a =
2e3+10;
const
int b =
2e5+10;
class
grag[b]
;class
gra_inv
ig[b]
;int n,m,s,t,k;
int head[a]
,ihead[a]
,g[a]
,dis[a]
,tot,itot;
bool vis[a]
;class
pbool
operator
<
(const p& rhs)
const};
priority_queueque;
void
init()
void
add(
int u,
int v,
int w)
void
iadd
(int u,
int v,
int w)
void
dijkstra
(int st)
que.
push(p
(st,0)
);dis[st]=0
;while
(que.
size()
)}}for
(int i=
1;i<=n ;i++)}
inta_star
(int st)
for(
int i=head[u]
;i!=-1
;i=g[i]
.next)
}return-1
;}intmain()
scanf
("%d%d%d"
,&s,
&t,&k);if
(s == t) k++
;dijkstra
(t);
printf
("%d\n"
,a_star
(s))
;return0;
}
poj 2449 k短路模板
include include include include include using namespace std const int maxn 1001 const int maxm 100001 const int inf 1 30 struct edge edge e1 maxm edge...
poj 2449 k短路 A 演算法
k短路的定義 1.如果起點終點相同,那麼0並不是最短路,而是要出去一圈回來之後才是最短路,那麼第k短路也是一樣。2.每個頂點和每條邊都可以使用多次。可以存在環和來回走 給定起終點,求k短路的長度 然後求k短路使用a 演算法,其估價函式f n g n h n h n 是終點到結點n的最短路徑,g n ...
poj2449 k短路問題
這個題就是讓你求出s點到t點的第k短路,使用a 搜尋就可以,搜尋使用兩個指標函式 h g,h表示從源點到當前點的最短路,g點表示從當前點到匯點的最短路,搜尋的時候v頂點第k次出隊時的h就是第k短路的長度,如下 include include include include include using...