这个题就是求一个有向边的K短路问题,有向边必须将边分开存,当无向边时不用分开存
#include <cstring>
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int N=1000+10;
int n,m,u,v,val,s,e,k,t;
int dis[N];
struct P
{
int to,cost;
bool operator < (const P & a) const
{
return cost>a.cost;
}
};
vector<P> edge[N],redge[N];
void Dijkstra()
{
fill(dis,dis+n+2,INF);
dis[e]=0;
priority_queue<P> qu;
qu.push(P{e,0});
while(!qu.empty()){
P x=qu.top();
qu.pop();
for(int i=0;i<redge[x.to].size();i++){
P y=redge[x.to][i];
if(dis[y.to]>dis[x.to]+y.cost){
dis[y.to]=dis[x.to]+y.cost;
qu.push(P{y.to,dis[y.to]});
}
}
}
}
struct node
{
int to,len;
bool operator < (const node & a) const
{
return len+dis[to]>a.len+dis[a.to];
}
};
int A_star()
{
if(dis[s]==INF) return -1;//判断有无最短路
priority_queue<node> qu;
qu.push(node{s,0});
int num=0;
while(!qu.empty()){
node a=qu.top();
qu.pop();
if(a.to==e) num++;
if(num==k) return a.len;
if(num<k && a.len>t) return -1;//剪枝没有访问到第k次就不符合要求就立即退出
for(int i=0;i<edge[a.to].size();i++){
P b=edge[a.to][i];
qu.push(node{b.to,a.len+b.cost});
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<=n;i++){
redge[i].clear();
edge[i].clear();
}
scanf("%d%d%d%d",&s,&e,&k,&t);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&val);
edge[u].push_back(P{v,val});//有向图要正反向分开存边
redge[v].push_back(P{u,val});
}
Dijkstra();
int ans=A_star();
if(ans==-1) printf("Whitesnake!\n");
else printf("yareyaredawa\n");
}
return 0;
}