poj 3259

这道题目很简单,关键是看懂题目。

题目大意:有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.

你可能感兴趣的:(poj 3259)