题目链接:http://poj.org/problem?id=2449
求各点到目的地之间的最短路,以此为h,进行A*搜索,待目的地入队k次,当前路程即为k短路
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
using namespace std;
#define N 1100
#define M 201008
#define Inf 0x7ffffff
typedef struct{
int v,c,nxt;
}Edge;
typedef struct talQ{
int v,d,h;
bool operator <(const talQ &a)const
{return a.d+a.h<d+h;}
}Q;
Edge edg[M];
int tail[N];
int head[N];
int h[N];
int vis[N];
int n,m,e;
int s,t,k;
void AddEdge(int u,int v,int c)
{
edg[e].v=v;edg[e].c=c;edg[e].nxt=head[u];head[u]=e++;
edg[e].v=u;edg[e].c=c;edg[e].nxt=tail[v];tail[v]=e++;
}
void Dijkstra()
{
int i,j,c,v;
int tmp,min;
memset(vis,0,sizeof(vis));
for(i=0;i<=n;i++)
h[i]=Inf;
h[t]=0;
for(i=0;i<n;i++){
min=Inf,c=0;
for(j=1;j<=n;j++){
if(vis[j]) continue;
if(h[j]<min)
min=h[j],c=j;
}
if(c==0) break;
vis[c]=1;
for(tmp=tail[c];tmp!=-1;tmp=edg[tmp].nxt){
v=edg[tmp].v;
if(h[v]-edg[tmp].c>h[c])
h[v]=h[c]+edg[tmp].c;
}
}
}
int Astarkth()
{
Q cur,nxt;
priority_queue<Q>q;
int tmp,v;
if(h[s]==Inf) return -1;
memset(vis,0,sizeof(vis));
cur.d=0;cur.v=s;cur.h=h[s];
q.push(cur);
while(!q.empty()){
cur=q.top();q.pop();
vis[cur.v]++;
if(vis[cur.v]>k) continue;
if(vis[t]==k) return cur.d;
for(tmp=head[cur.v];tmp!=-1;tmp=edg[tmp].nxt){
v=edg[tmp].v;
nxt.d=edg[tmp].c+cur.d;
nxt.v=v;nxt.h=h[v];
q.push(nxt);
}
}
return -1;
}
int main()
{
int i;
int u,v,c;
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
head[i]=tail[i]=-1;
while(m--){
scanf("%d%d%d",&u,&v,&c);
AddEdge(u,v,c);
}
scanf("%d%d%d",&s,&t,&k);
if(s==t) k++;
Dijkstra();
printf("%d\n",Astarkth());
return 0;
}