Language:
Wormholes
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 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 Input
Line 1: A single integer,
Line 1 of each farm: Three space-separated integers respectively: Lines 2.. M+1 of each farm: Three space-separated numbers ( S, Lines Output
Lines 1..
F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).
Sample Input 2 3 3 1 1 2 2type edge=record a,b,c:longint; 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 Hint
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. Source |
type edge=record a,b,c:longint; end; var f,k,m,n,w:longint; flag:boolean; e:array[1..10000] of edge; d:array[1..10000] of longint; procedure init; var i:longint; begin fillchar(e,sizeof(e),0); fillchar(d,sizeof(d),70); read(n,m,w); for i:=1 to m do begin read(e[(i-1)*2+1].a); read(e[(i-1)*2+1].b); read(e[(i-1)*2+1].c); e[(i-1)*2+2].a:=e[(i-1)*2+1].b; e[(i-1)*2+2].b:=e[(i-1)*2+1].a; e[(i-1)*2+2].c:=e[(i-1)*2+1].c; end; for i:=2*m+1 to 2*m+w do with e[i] do begin read(e[i].a); read(e[i].b); read(e[i].c); e[i].c:=-e[i].c; end; end; function relaxed(u,v,w:longint):boolean; begin if d[u]+w<d[v] then begin d[v]:=d[u]+w; exit(true); end; exit(false); end; function bellmanford(s:longint):boolean; var i,j:longint; begin d[s]:=0; for i:=1 to n-1 do begin flag:=false; for j:=1 to 2*m+w do if relaxed(e[j].a,e[j].b,e[j].c) then flag:=true; if not flag then break; end; for i:=1 to 2*m+w do if relaxed(e[i].a,e[i].b,e[i].c) then exit(false); exit(true); end; begin read(f); for k:=1 to f do begin init; if bellmanford(1) then writeln('NO') else writeln('YES'); end; end.