helianthus-kduanlu
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
#include<bits/stdc++.h>
using namespace std;
#define maxn 20100
#define maxm 20010
#define inf 1000000000
int head[maxn],nxt[maxm],head1[maxn],next1[maxm],S,T,k,K,n,m,e;
int dis[maxn];
bool vis[maxn];
struct edge{
int u,v,c;
}a[maxm];
struct dat{
int v,c;
friend bool operator < (const dat&a,const dat&b){
return a.c+dis[a.v]>b.c+dis[b.v];
}
};
void add(int u,int v,int c)
{
a[e]=(edge){u,v,c};
nxt[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<dat> q;
q.push((dat){src,0});
while(!q.empty()){
dat pre=q.top();q.pop();
vis[pre.v]=true;
for(int i=head1[pre.v];i+1;i=next1[i]){
if(dis[a[i].u]>dis[pre.v]+a[i].c){
dis[a[i].u]=dis[pre.v]+a[i].c;
q.push((dat){a[i].u,0});
}
}
while(!q.empty()&&vis[q.top().v]) q.pop();
}
}
int astar(int src)
{
priority_queue<dat> q;
q.push((dat){src,0}); k--;
while(!q.empty()){
dat pre=q.top();q.pop();
if(pre.v==T){
if(k) k--;
else return pre.c;
}
for(int i=head[pre.v];i+1;i=nxt[i]){
q.push((dat){a[i].v,pre.c+a[i].c});
}
}
return -1;
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(head,-1,sizeof(head));
memset(head1,-1,sizeof(head1));
memset(nxt,-1,sizeof(nxt));
memset(next1,-1,sizeof(next1));
e=0;
scanf("%d%d%d%d",&S,&T,&k,&K);
for(int i=0;i<m;i++){
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
add(u,v,c);
}
dij(T);
if(dis[S]==inf){
puts("Whitesnake!");
continue;
}
if(S==T) k++;
int tmp=astar(S);
if(tmp<=K&&tmp!=-1) puts("yareyaredawa");
else puts("Whitesnake!");
}
}
#include
using namespace std;
#define maxn 20100
#define maxm 20010
#define inf 1000000000
int head[maxn],nxt[maxm],head1[maxn],next1[maxm],S,T,k,K,n,m,e;
int dis[maxn];
bool vis[maxn];
struct edge{
int u,v,c;
}a[maxm];
struct dat{
int v,c;
friend bool operator < (const dat&a,const dat&b){
return a.c+dis[a.v]>b.c+dis[b.v];
}
};
void add(int u,int v,int c)
{
a[e]=(edge){u,v,c};
nxt[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
q.push((dat){src,0});
while(!q.empty()){
dat pre=q.top();q.pop();
vis[pre.v]=true;
for(int i=head1[pre.v];i+1;i=next1[i]){
if(dis[a[i].u]>dis[pre.v]+a[i].c){
dis[a[i].u]=dis[pre.v]+a[i].c;
q.push((dat){a[i].u,0});
}
}
while(!q.empty()&&vis[q.top().v]) q.pop();
}
}
int astar(int src)
{
priority_queue
q.push((dat){src,0}); k--;
while(!q.empty()){
dat pre=q.top();q.pop();
if(pre.v==T){
if(k) k--;
else return pre.c;
}
for(int i=head[pre.v];i+1;i=nxt[i]){
q.push((dat){a[i].v,pre.c+a[i].c});
}
}
return -1;
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(head,-1,sizeof(head));
memset(head1,-1,sizeof(head1));
memset(nxt,-1,sizeof(nxt));
memset(next1,-1,sizeof(next1));
e=0;
scanf("%d%d%d%d",&S,&T,&k,&K);
for(int i=0;i int u,v,c; scanf("%d%d%d",&u,&v,&c); add(u,v,c); } dij(T); if(dis[S]==inf){ puts("Whitesnake!"); continue; } if(S==T) k++; int tmp=astar(S); if(tmp<=K&&tmp!=-1) puts("yareyaredawa"); else puts("Whitesnake!"); } }