poj 1860

题目大意:

给定N种货币,某些货币之间可以相互兑换,现在给定一些兑换规则,问能否从某一种货币开始兑换,经过一些中间货币之后,最后兑换回这种货币,并且得到的钱比之前的多。

分析:

如果钱可以无限增加,那么图就出现了正权回路。用bellman-ford算法可以快速求出。

如果bellman-ford循环n次后,依然可以进行松弛,那么他一定有正(负)权回路。

 

const
 maxe=20000;
type
 arr=record
   x,y:longint;
   w,t:real;
 end;
 
var
 n,m,f:longint;
 w:real;
 a:array[1..maxe] of arr;
 d:array[1..maxe] of real;
 i,j,k:longint;
 
procedure relax(u,v:longint;w,t:real);
begin
  if (d[u]-t)*w>d[v] then
    d[v]:=(d[u]-t)*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,t);
  for i:=1 to m do
    with a[i] do
      if (d[x]-t)*w>d[y] then exit(true);
  exit(false)
end;
 
begin
    readln(n,m,f,w);
    for j:=1 to m do
     begin
      with a[j*2-1] do
       read(x,y,w,t);
       a[j*2].x:=a[j*2-1].y;
       a[j*2].y:=a[j*2-1].x;
       with a[j*2] do
        read(w,t);
     end;
    m:=m*2;
   d[f]:=w;
  if bellman then write('YES')
             else write('NO');
end.

 

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