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