这道题目很简单,关键是看懂题目。
题目大意:有F组数据,n个点,m条双向边,w条单向负权边,求有没有负权回路。
SampleInput
2 //F
3 3 1 //n,m,w
1 2 2
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8
SampleOutput
NO
YES
用 bellman-ford 算法做松驰操作,得到如果第n+1次循环仍能松驰,那么存在负权回路。
标程(pascal):
const
maxe=10000;
type
arr=record
x,y,w,next:longint;
end;
var
n,m,w,f:longint;
a:array[1..maxe] of arr;
d:array[1..maxe] of longint;
i,j,k:longint;
procedurerelax(u,v,w:longint);
begin
if d[u]+w<d[v] then
d[v]:=d[u]+w;
end;
functionbellman: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
read(f);
for i:=1 to f do
begin
readln(n,m,w);
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 w do
with a[j+m] do
begin
read(x,y,w);
w:=-w;
end;
d[1]:=0;
m:=m+w;
if bellman then write('YES')
else write('NO');
end;
end.