https://nanti.jisuanke.com/t/31445
#include<iostream>
#include<queue>
#include <string.h>
#include<algorithm>
#define MAXN 1010
using namespace std;
const int inf=0x3f3f3f3f;
int dist[MAXN]; //**dist[i]记录此时源点到i的最短距离
bool vis[MAXN]; //***标记点是否在队列中
int cnt[MAXN]; //***cnt[i]记录i节点入队次数,判断是否存在负权环
vector<pair<int, int> >mp[MAXN], mp2[MAXN];//mp储存原图,mp2存储反向图
struct node
{
int point;
int g, f;
friend bool operator<(node a, node b)
{
return a.f==b.f?a.g>b.g:a.f>b.f;
}
};
int A_star(int s, int e, int n, int k)
{
priority_queue<node> q;
int cnt=0;//***当前为第cnt短路
if(s==e) //**本题题要求一定要经过其他点,即若终点和起点相同的话即为求第k+1短路
{
k++;
}
if(dist[s]==inf) //***终点点不可达
{
return -1;
}
node node1;
node1.point=s;
node1.g=0;
node1.f=dist[s]+node1.g;
q.push(node1);
while(!q.empty())
{
node cc=q.top(); //***将估价值最小的节点出队
q.pop();
if(cc.point==e) //**求出第cnt短路
{
cnt++;
}
if(cnt==k) //***已求出第k短路
{
return cc.g;
}
for(int i=0; i<mp[cc.point].size(); i++) //**遍历当前节点的所有邻节点
{
node node2;
node2.point=mp[cc.point][i].first;
node2.g=cc.g+mp[cc.point][i].second;
node2.f=node2.g+dist[node2.point];
q.push(node2);
}
}
return -1;
}
bool spfa(int n, int s) //**注意这里的n的实参是e,求出反向图中所有节点到n的最短距离,即所有节点到e的最短距离,即求出 h(x)
{
memset(dist, 0x3f, sizeof(dist));
queue<int> q;
while(!q.empty())
{
q.pop();
}
q.push(s);
dist[s]=0;
cnt[s]+=1;
vis[s]=true;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=0; i<mp2[u].size(); i++)
{
int point=mp2[u][i].first;
if(dist[point]>dist[u]+mp2[u][i].second) //**松驰操作
{
dist[point]=dist[u]+mp2[u][i].second;
if(!vis[point]) //***若此点不在队列中则将其入队
{
vis[point]=true;
q.push(point);
cnt[point]++;
if(cnt[point]>n) //***判断是否存在负权环
{
return false;
}
}
}
}
}
return true;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n, m;
int x, y, z;
while(cin>>n>>m)
{
for (int i=0; i<=n ; i++ )
{
mp[i].clear();
mp2[i].clear();
}
int s, e, k,t;
cin >> s >> e >> k>>t;
while(m--)
{
cin >> x >> y >> z;
mp[x].push_back(make_pair(y, z));
mp2[y].push_back(make_pair(x, z)); //**建立反向图
}
spfa(n, e);
int res=A_star(s, e, n, k);
if(res==-1)
cout<<"Whitesnake!"<<endl;
else
{
if(res<=t)
cout<<"yareyaredawa"<<endl;
else
cout<<"Whitesnake!"<<endl;
}
}
return 0;
}