poj 2449 k短路 A 演算法

2021-06-26 17:24:31 字數 1683 閱讀 2927

k短路的定義:

1.如果起點終點相同,那麼0並不是最短路,而是要出去一圈回來之後才是最短路,那麼第k短路也是一樣。

2.每個頂點和每條邊都可以使用多次。(可以存在環和來回走)

給定起終點,求k短路的長度

然後求k短路使用a*演算法,其估價函式f(n) = g(n)+h(n),h(n)是終點到結點n的最短路徑,g(n)是起點到結點n的實際代價, 這樣選擇顯然能滿足a*估價函式的要求,g(n)>=g'(n),

h(n)<=h'(n)。

h(n)可以對原圖的逆圖進行spfa得出。

終止條件是,如果終點第k次出隊的話,那麼表明已經找到第k短路。

注意處理起點終點不連通的情況。

#pragma comment(linker, "/stack:36777216")

#pragma gcc optimize ("o2")

#include #include #include #include #include #include #include #include #include using namespace std;

#define rd(x) scanf("%d",&x)

#define rd2(x,y) scanf("%d%d",&x,&y)

#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define clr0(x) memset(x,0,sizeof(x))

#define clr1(x) memset(x,-1,sizeof(x))

#define eps 1e-9

const double pi = acos(-1.0);

typedef long long ll;

typedef unsigned long long ull;

const int modo = 1e9 + 7;

const int inf = 0x3f3f3f3f;

const int inf = 0x3fffffff;

const int maxn = 1005,maxm = 100005;

struct edge;

edge(int vv,int ww,int nnext):v(vv),w(ww),next(nnext){};

}e[maxm<<1];

struct node;

node(int ff,int gg,int vv):f(ff),g(gg),v(vv){};

bool operator < (const node &a) const

};int head[maxn],tail[maxn],dist[maxn],inq[maxn];

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

void init()

void add(int u,int v,int w)

void spfa(int src)}}

}int astar(int src,int dst)

}return -1;

}int main()

rd3(s,t,k);s--,t--;

spfa(t);

if(s == t)//如果起點終點相同,0不是第1短路徑。。

k++;

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

}return 0;

}

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 kk短路長度。思路 經典問題的經典演算法 a a a 搜尋。感覺a a a 搜尋和dij kstr adijkstra dijkst ra堆優化寫法有很多類似的地方。首先以每個點到終點的最短距離作為估計函式g gg,故先需要反向建圖,隨後對反圖從終點t tt做一遍d...

poj2449 k短路問題

這個題就是讓你求出s點到t點的第k短路,使用a 搜尋就可以,搜尋使用兩個指標函式 h g,h表示從源點到當前點的最短路,g點表示從當前點到匯點的最短路,搜尋的時候v頂點第k次出隊時的h就是第k短路的長度,如下 include include include include include using...