(http://www.elijahqi.win/2017/07/12/%E3%80%90luogu2850%E3%80%91usaco06dec%E8%99%AB%E6%B4%9Ewormholes/%20%E2%80%8E)
题目描述
While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of FJ’s farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..N, M (1 ≤ M ≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.
As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet himself :) .
To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back in time by more than 10,000 seconds.
John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地,并有W个虫洞。其中1<=N<=500,1<=M<=2500,1<=W<=200。 现在John想借助这些虫洞来回到过去(出发时刻之前),请你告诉他能办到吗。 John将向你提供F(1<=F<=5)个农场的地图。没有小路会耗费你超过10000秒的时间,当然也没有虫洞回帮你回到超过10000秒以前。
输入输出格式
输入格式:
Line 1: A single integer, F. F farm descriptions follow.
Line 1 of each farm: Three space-separated integers respectively: N, M, and W
Lines 2..M+1 of each farm: Three space-separated numbers (S, E, T) that describe, respectively: a bidirectional path between S and E that requires T seconds to traverse. Two fields might be connected by more than one path.
Lines M+2..M+W+1 of each farm: Three space-separated numbers (S, E, T) that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.
输出格式:
Lines 1..F: For each farm, output “YES” if FJ can achieve his goal, otherwise output “NO” (do not include the quotes).
输入输出样例
输入样例#1:
2
3 3 1
1 2 2
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8
输出样例#1:
NO
YES
说明
For farm 1, FJ cannot travel back in time.
For farm 2, FJ could travel back in time by the cycle 1->2->3->1, arriving back at his starting location 1 second before he leaves. He could start from anywhere on the cycle to accomplish this.
题解:dfs-spfa判断负环,当然bfs也可以,因为数据量小
今天再次将变量名写错。我。浪费很多时间
#include <cstdio>#include <cstring>
#define N 550
#define inf 0x7fffffff
inline int read(){
int x=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x;
}
int num,h[N],n,m,w;
struct node
{
int x,y,z,next;
}data[6000];
inline void insert1(int x,int y,int z){
data[++num].x=x;data[num].y=y;data[num].z=z;data[num].next=h[x];h[x]=num;
//data[++num].x=y;data[num].y=x;data[num].z=z;data[num].next=h[y];h[y]=num;
}
bool flag,visit[N];
int f[N];
void spfa(int x){
if (visit[x]==true){
visit[x]=false;flag=true;return;
}
visit[x]=true;
for (int i=h[x];i;i=data[i].next){
int y=data[i].y,z=data[i].z;
if (f[x]+z<f[y]){
//printf("f[y]%d,f[y]);
f[y]=f[x]+z;//printf("%d %d %d\n",x,y,z);printf("%d,visit[y]);printf("%dasdfasd%dasdf",f[x],f[y]);
/* if (visit[y]||flag){
flag=true;break;
}*/
spfa(y);
if (flag) break;
}
}
visit[x]=false;
}
int main(){
freopen("2850.in","r",stdin);
freopen("2850.out","w",stdout);
int F=read();
while (F--){
n=read();m=read();w=read();
num=0;memset(h,0,sizeof(h));
memset(visit,false,sizeof(visit));
int x,y,z;flag=false;
for (int i=1;i<=m;++i) {
x=read();y=read();z=read();
insert1(x,y,z);insert1(y,x,z);
}
for (int i=1;i<=w;++i){
x=read();y=read();z=read();
insert1(x,y,-z);
}
//for (int i=1;i<=num;++i) printf("%d %d %d\n",data[i].x,data[i].y,data[i].z);
//for (int i=1;i<=n;++i) f[i]=inf;
memset(f,0,sizeof(f));
for (int i=1;i<=n;++i){
spfa(i);//for (int i=1;i<=n;++i) printf("%d,f[i]);
if (flag) break;
}
if (flag)printf("YES\n");else printf("NO\n");
}
return 0;
}