Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 34833 | Accepted: 12724 |
Description
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.
Input
Output
Sample Input
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
Sample Output
NO YES
//题目大意是此人能不能经过进虫洞时光倒流,就是裸的贝尔曼判环。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m,w,z; struct node { int a,b,c; }q[100010]; int dis[100010]; void creat(int s,int e,int t) { q[z].a=s; q[z].b=e; q[z++].c=t; } int bf() { int i,j; //memset(vis,0,sizeof(vis));//注意贝尔曼中不需要标记数组 for(i=1;i<=n;i++) { dis[i]=0x3f3f3f3f; } dis[1]=0; //vis[1]=1; for(i=0;i<n-1;i++) { for(j=0;j<z;j++) { if(dis[ q[j].b ]>dis[q[j].a ]+q[j].c)//弄清楚谁大于谁 { dis[q[j].b ]=dis[ q[j].a ]+q[j].c; } } } for(i=0;i<z;i++) { if(dis[q[i].b ]>dis[q[i].a ]+q[i].c) { return 1; } } return 0; } int main() { int s,e,t,i,j,k; cin>>k; while(k--) { z=0; cin>>n>>m>>w; for(i=0;i<m;i++) { cin>>s>>e>>t; creat(s,e,t); creat(e,s,t); } for(i=0;i<w;i++) { cin>>s>>e>>t; creat(s,e,-t); } int p=bf(); if(p) puts("YES"); else puts("NO"); } return 0; }