pku3259 Wormholes

来源:互联网 发布:淘宝店铺装修克隆 编辑:程序博客网 时间:2024/06/13 06:29

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..NM (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

Line 1: A single integer, FF farm descriptions follow. 
Line 1 of each farm: Three space-separated integers respectively: NM, and W 
Lines 2..M+1 of each farm: Three space-separated numbers (SET) 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 (SET) that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.

Output

Lines 1..F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).

题解

         用BELLMAN找负权环,有的输出YES,否则输出NO。

代码

       

const  maxn=100000;type  ccc=record    a,b,w:longint;  end;var  a:array[1..maxn]of ccc;  dis:array[1..maxn]of longint;  n,m,b,s:longint;procedure relax(u,v,w:longint);begin  if dis[u]+w<dis[v] then    dis[v]:=dis[u]+w;end;function bellman_ford:boolean;var  i,j:longint;begin  for i:=1to n do    for j:=1 to m do      relax(a[j].a,a[j].b,a[j].w);  for i:=1 to m do    if dis[a[i].a]+a[i].w<dis[a[i].b] then exit(true);  exit(false)end;procedure init;var  i,j:longint;begin  readln(s);  for i:=1 to s do    begin      readln(n,m,b);      fillchar(a,sizeof(a),0);      fillchar(dis,sizeof(dis),$7f);      dis[1]:=0;      for j:=1 to m do        begin          readln(a[j*2-1].a,a[j*2-1].b,a[j*2-1].w);          a[j*2].a:=a[j*2-1].b;          a[j*2].b:=a[j*2-1].a;          a[j*2].w:=a[j*2-1].w;        end;      m:=m*2;      for j:=1 to b do        begin          readln(a[j+m].a,a[j+m].b,a[j+m].w);          a[j+m].w:=a[j+m].w*-1;        end;      m:=m+s;      if bellman_ford then writeln('YES')        else writeln('NO')    end;end;begin  init;end.

3 0