K短路
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define N 1010
#define M 100100
#define inf 300000000
using namespace std;
int S,T,K,n,m;
int head[N],rehead[N];
int num,renum;
int dis[N];
bool visit[N];
int ans[N];
struct Edge{
int v,len,next;
}edge[M],reedge[M];
struct a_star //A*搜索时的优先级队列
{
int v;
int len;
bool operator<(const a_star &a)const //f(i)=d[i]+g[i]
{
return len+dis[v]>a.len+dis[a.v];
}
};
void insert(int u,int v,int len)//正图和逆图
{
edge[num].v=v;
edge[num].len=len;
edge[num].next=head[u];
head[u]=num;
num++;
reedge[renum].v=u;
reedge[renum].len=len;
reedge[renum].next=rehead[v];
rehead[v]=renum;
renum++;
}
void init()
{
memset(ans,0,sizeof(ans));
memset(head,-1,sizeof(head));
memset(rehead,-1,sizeof(rehead));
num=0,renum=0;
}
void spfa()//从T开始求出T到所有点的 dis[]
{
queue<int>q;
int i,j;
for(i=1;i<=n;i++)
dis[i]=inf;
dis[T]=0;
visit[T]=1;
q.push(T);
while(!q.empty())
{
int temp=q.front();
q.pop();
visit[temp]=0;
for(i=rehead[temp]; i!=-1 ; i=reedge[i].next)
{
int tt=reedge[i].v;
int ttt=reedge[i].len;
if(dis[tt]>dis[temp]+ttt)
{
dis[tt]=dis[temp]+ttt;
if(!visit[tt])
{
q.push(tt);
visit[tt]=1;
}
}
}
}
}
int A_star()//A*算法
{
if(S==T)K++; //具体题目要求
if(dis[S]==inf)return -1;
a_star n1;
n1.v=S;
n1.len=0;
priority_queue <a_star> q;
q.push(n1);
while(!q.empty())
{
a_star temp=q.top();
q.pop();
ans[temp.v]++;
if(ans[T]==K)//当第K次取到T的时候,输出路程
return temp.len;
if(ans[temp.v]>K)
continue;
for(int i=head[temp.v]; i!=-1; i=edge[i].next)
{
a_star n2;
n2.v=edge[i].v;
n2.len=edge[i].len+temp.len;
q.push(n2);
}
}
return -1;
}
int main()
{
int i,j,k,l;
int a,b,s;
scanf("%d%d",&n,&m);
init();
while(m--)
{
scanf("%d%d%d",&a,&b,&s);
insert(a,b,s);
}
scanf("%d%d%d",&S,&T,&K);
spfa();
printf("%d\n",A_star());
return 0;
}