2017-team2/kpath
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;++i)
#define mp make_pair
#define x0 gtmsub
#define y0 gtmshb
#define x1 gtmjtjl
#define y1 gtmsf
#define next fuckyou
#define inf 1000000000
#define MAXN 1005
#define MAXM 100005
int head[MAXN],next[MAXM],head1[MAXN],next1[MAXM];
int dis[MAXN];
bool vis[MAXN];
int n,m,e,st,en,k;
struct note
{
int u,v,c;
note(){}
note(int u,int v,int c):u(u),v(v),c(c){}
}p[MAXM];
struct POJ
{
int v,c;
POJ(){}
POJ(int v,int c):v(v),c(c){}
bool operator <(const POJ& other)const
{
return c+dis[v]>other.c+dis[other.v];
}
};
void addnote(int u,int v,int c)
{
p[e]=note(u,v,c);
next[e]=head[u]; head[u]=e;
next1[e]=head1[v];head1[v]=e++;
}
void dij(int src)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)dis[i]=inf;
dis[src]=0;
priority_queue<POJ>que;
que.push(POJ(src,0));
while (!que.empty())
{
POJ pre=que.top(); que.pop();
vis[pre.v]=true;
for(int i=head1[pre.v];i+1;i=next1[i])
{
if (dis[p[i].u]>dis[pre.v]+p[i].c)
{
dis[p[i].u]=dis[pre.v]+p[i].c;
que.push(POJ(p[i].u,0));
}
}
while (!que.empty()&& vis[que.top().v])que.pop();
}
}
int limit;
int a_star(int src)
{
priority_queue<POJ> que;
que.push(POJ(src,0)); k--;
while (!que.empty())
{
POJ pre=que.top(); que.pop();
if(pre.c>limit)return -1;
if (pre.v==en)
{
if (k)k--;
else return pre.c;
}
for(int i=head[pre.v];i+1;i=next[i])
que.push(POJ(p[i].v,pre.c+p[i].c));
}
return -1;
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
memset(head,-1,sizeof(head));
memset(head1,-1,sizeof(head1));
e=0;
scanf("%d%d%d%d",&st,&en,&k,&limit);
for(int i=0;i<m;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
addnote(u,v,c);
}
dij(en);
if (dis[st]==inf){ puts("Whitesnake!"); continue; }
if (st==en)k++;
int shit=a_star(st);
if (shit==-1 || shit>limit)puts("Whitesnake!"); else puts("yareyaredawa");
}
return 0;
}
}}}
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;++i)
#define mp make_pair
#define x0 gtmsub
#define y0 gtmshb
#define x1 gtmjtjl
#define y1 gtmsf
#define next fuckyou
#define inf 1000000000
#define MAXN 1005
#define MAXM 100005
int head[MAXN],next[MAXM],head1[MAXN],next1[MAXM];
int dis[MAXN];
bool vis[MAXN];
int n,m,e,st,en,k;
struct note
{
int u,v,c;
note(){}
note(int u,int v,int c):u(u),v(v),c(c){}
}p[MAXM];
struct POJ
{
int v,c;
POJ(){}
POJ(int v,int c):v(v),c(c){}
bool operator <(const POJ& other)const
{
return c+dis[v]>other.c+dis[other.v];
}
};
void addnote(int u,int v,int c)
{
p[e]=note(u,v,c);
next[e]=head[u]; head[u]=e;
next1[e]=head1[v];head1[v]=e++;
}
void dij(int src)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)dis[i]=inf;
dis[src]=0;
priority_queue<POJ>que;
que.push(POJ(src,0));
while (!que.empty())
{
POJ pre=que.top(); que.pop();
vis[pre.v]=true;
for(int i=head1[pre.v];i+1;i=next1[i])
{
if (dis[p[i].u]>dis[pre.v]+p[i].c)
{
dis[p[i].u]=dis[pre.v]+p[i].c;
que.push(POJ(p[i].u,0));
}
}
while (!que.empty()&& vis[que.top().v])que.pop();
}
}
int limit;
int a_star(int src)
{
priority_queue<POJ> que;
que.push(POJ(src,0)); k--;
while (!que.empty())
{
POJ pre=que.top(); que.pop();
if(pre.c>limit)return -1;
if (pre.v==en)
{
if (k)k--;
else return pre.c;
}
for(int i=head[pre.v];i+1;i=next[i])
que.push(POJ(p[i].v,pre.c+p[i].c));
}
return -1;
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
memset(head,-1,sizeof(head));
memset(head1,-1,sizeof(head1));
e=0;
scanf("%d%d%d%d",&st,&en,&k,&limit);
for(int i=0;i<m;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
addnote(u,v,c);
}
dij(en);
if (dis[st]==inf){ puts("Whitesnake!"); continue; }
if (st==en)k++;
int shit=a_star(st);
if (shit==-1 || shit>limit)puts("Whitesnake!"); else puts("yareyaredawa");
}
return 0;
}