POJ - 2449 Remmarguts’ Date
A
∗
A∗
A∗ 优化算法
采用
D
i
j
k
s
t
r
a
Dijkstra
Dijkstra最短路思想,每次扩展最短的路径,第
k
k
k 次到达终点时的路径长度即为第
k
k
k 短路的长度。
由于算法相当于同时进行
k
k
k 次单元最短路,时间和空间都可能会超限,因此 预处理每个点到终点的最短距离作为估价函数,利用
A
∗
A∗
A∗ 算法优化。
复杂度为
O
(
n
k
l
o
g
n
)
O(nklogn)
O(nklogn)。
#include<cstdio>
#include<cstring>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
typedef pair<int,PII> PIII;
const int N = 1010, M = 200010;
int n,m,S,T,K;
int h[N],rh[N],e[M],w[M],ne[M],idx;
int dist[N],cnt[N];
bool st[N];
void add(int h[], int a, int b, int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dijkstra()
{
priority_queue<PII, vector<PII>, greater<PII> >heap;
heap.push((PII){0,T});
memset(dist, 0x3f, sizeof dist);
dist[T]=0;
while(heap.size())
{
PII t=heap.top();heap.pop();
int ver=t.y;
if(st[ver]) continue;
st[ver]=true;
for(int i=rh[ver];~i;i=ne[i])
{
int j=e[i];
if(dist[j]>dist[ver]+w[i])
{
dist[j]=dist[ver]+w[i];
heap.push((PII){dist[j],j});
}
}
}
}
int astar()
{
priority_queue<PIII,vector<PIII>,greater<PIII> >heap;
heap.push((PIII){dist[S],(PII){0,S}});
while(heap.size())
{
PIII t=heap.top();heap.pop();
int ver=t.y.y, distance=t.y.x;
cnt[ver]++;
if(cnt[T]==K) return distance;
for(int i=h[ver];~i;i=ne[i])
{
int j=e[i];
if(cnt[j]<K)
heap.push((PIII){distance+w[i]+dist[j],(PII){distance+w[i],j}});
}
}
return -1;
}
int main()
{
scanf("%d%d",&n,&m);
memset(h,-1,sizeof h);
memset(rh,-1,sizeof rh);
for(int i=0;i<m;i++)
{
int a,b,c;scanf("%d%d%d",&a,&b,&c);
add(h,a,b,c);add(rh,b,a,c);
}
scanf("%d%d%d",&S,&T,&K);
if(S==T) K++;
dijkstra();
printf("%d\n",astar());
return 0;
}