题目链接: https://nanti.jisuanke.com/t/31445
求第K短路,判断是否小于等于T
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int M=10000+100;
const int N=1010;
int n,m;
int s,ex,k,t;
int u,v,w;
int ans;
int cnt,cnt2;
struct edge
{
int v;
int w;
int next;
}e[M],e2[M];
int dis[N],vis[N],head[N],head2[N];
struct node
{
int pos;
int cost;
node(){}
node(int pos,int cost):pos(pos),cost(cost){}
friend bool operator<(node a,node b)
{
return a.cost>b.cost;
}
};
struct node2
{
int v;
int g,f;
node2(){}
node2(int v,int g,int f):v(v),g(g),f(f){}
friend bool operator<(node2 a,node2 b)
{
if(a.f==b.f)
return a.g>b.g;
return a.f>b.f;
}
};
void init()
{
cnt=0;
cnt2=0;
fill(dis,dis+N,inf);
memset(head,-1,sizeof(head));
memset(head2,-1,sizeof(head2));
memset(vis,0,sizeof(vis));
}
void add(int u,int v,int w)
{
e[cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt++;
}
void add2(int u,int v,int w)
{
e2[cnt2].v=v;
e2[cnt2].w=w;
e2[cnt2].next=head2[u];
head2[u]=cnt2++;
}
void Dijkstra(int* head,edge* e)
{
priority_queue<node> q;
node now;
dis[ex]=0;
q.push(node(ex,0));
while(!q.empty())
{
now=q.top();
q.pop();
if(vis[now.pos])
continue;
vis[now.pos]=1;
for(int i=head[now.pos];i!=-1;i=e[i].next)
{
if(dis[e[i].v]>dis[now.pos]+e[i].w)
{
dis[e[i].v]=dis[now.pos]+e[i].w;
q.push(node(e[i].v,dis[e[i].v]));
}
}
}
}
int Astar()
{
priority_queue<node2> q;
node2 now;
int num=0;
if(s==ex)//感觉可以去掉
k++;//
if(dis[s]==inf)
return inf;
q.push(node2(s,0,0+dis[s]));
while(!q.empty())
{
now=q.top();
q.pop();
if(now.v==ex)
num++;
if(num>=k)
return now.g;
for(int i=head[now.v];i!=-1;i=e[i].next)
q.push(node2(e[i].v,now.g+e[i].w,now.g+e[i].w+dis[e[i].v]));
}
return inf;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
scanf("%d%d%d%d",&s,&ex,&k,&t);
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add2(v,u,w);
}
Dijkstra(head2,e2);
ans=Astar();
if(ans<=t)
printf("yareyaredawa\n");
else
printf("Whitesnake!\n");
}
return 0;
}