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
23 3 11 2 22 3 11 3 43 1 32 3 43 2 1 1 2 33 1 8
Sample Output
NOYES
Hint
<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 500 + 10;
const int MAXM = 5000 + 1000;
const int INF = 0x3f3f3f3f;
int n,m,w,k;
int f[MAXN];
//从顶点s指向顶点e的权值为t的边
struct farm
{
int s,e,t;
}map[MAXM];
//记录一条从顶点x到顶点y权值为z的路径
void join(int x,int y,int z)
{
map[k].s = x;
map[k].e = y;
map[k].t = z;
k++;
}
//如果返回1则存在负圈,否则不存在
int Bellman_Ford()
{
memset(f,INF,sizeof(f));
f[1] = 0;
//求最短路
for(int i = 0;i < n;i++)
{
for(int j = 0;j < k;j++)
{
int u = map[j].s;
int v = map[j].e;
int w = map[j].t;
if(f[u] + w < f[v])
f[v] = f[u] + w;
}
}
for(int i = 0;i < n;i++)
{
for(int j = 0;j < k;j++)
{
int u = map[j].s;
int v = map[j].e;
int w = map[j].t;
if(f[u] + w < f[v]) //若还能更新,则存在负圈
return 1;
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d",&n,&m,&w);
int x,y,z;
k = 0;
for(int i = 0;i < m;i++)
{
scanf("%d %d %d",&x,&y,&z);
join(x,y,z);
join(y,x,z);
}
for(int i = 0;i < w;i++)
{
scanf("%d %d %d",&x,&y,&z);
join(x,y,-z);
}
if(Bellman_Ford())
printf("YES\n");
else printf("NO\n");
}
return 0;
}