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...