POJ 2449 K短路 A 搜尋

2021-08-18 11:08:15 字數 1787 閱讀 6787

題目鏈結

題意:求乙個有向圖的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...