poj 3259 Wormholes bellman
题意
John的农场里N块地,M条路连接两块地(双向),w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts(即是一条单向负权边)。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己(找有没有负权回路)。
分析
找有没有负权回路可是bellman的强项,用bellman求一个带负权的有向图中是否存在权值为负的回路,有输出YES,没有输出NO。
反思
做输入处理是我复制了以前的程序,但有一个变量没改,就wa了一个多钟,以后还是老老实实的自己写程序吧!
代码
const maxe=10000; maxv=20000; type arr=record x,y,w,next:longint; end; var n,m,s,f:longint; a:array[1..maxv] of arr; d:array[1..maxe] of longint; i,j,k:longint; procedure relax(u,v,w:longint); begin if d[u]+w<d[v] then d[v]:=d[u]+w; end; function bellman:boolean; var i,j:integer; begin for i:=1 to n do for j:=1 to m do with a[j] do relax(x,y,w); for i:=1 to m do with a[i] do if d[x]+w<d[y] then exit(true); exit(false) end; begin readln(f); for i:=1 to f do begin readln(n,m,s); fillchar(a,sizeof(a),0); fillchar(d,sizeof(d),$7f); for j:=1 to m do begin with a[j*2-1] do read(x,y,w); a[j*2].x:=a[j*2-1].y; a[j*2].y:=a[j*2-1].x; a[j*2].w:=a[j*2-1].w; end; m:=m*2; for j:=1 to s do with a[j+m] do begin read(x,y,w); w:=-w; end; m:=m+s; d[1]:=0; if bellman then writeln('YES') else writeln('NO'); end; end.