题目大意
给出一些货币和货币之间的兑换比率,问是否可以使某种货币经过一些列兑换之后,货币值增加。举例说就是1美元经过一些兑换之后,超过1美元。可以输出Yes,否则输出No。
分析
和poj1860一样——点一下
用bellman找最长路找正环,不过是输入时很蛋疼,慢慢的调字符串吧!!!
代码
const
maxe=10000;
maxv=20000;
type
arr=record
x,y:longint;
w,t:real;
end;
var
n,m,f:longint;
a:array[1..maxv] of arr;
s,s1:string;
c:array[1..maxe] of string;
d:array[1..maxe] of real;
i,j,k,kk:longint;
l:real;
t:longint;
procedure relax(u,v:longint;w:real);
var
i:real;
begin
i:=(d[u])*w;
if i>d[v] then
d[v]:=i;
end;
function bellman:boolean;
var
i,j:integer;
k:real;
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
begin
k:=d[x]*w;
if k>d[y] then exit(true);
end;
exit(false)
end;
procedure init;
begin
readln(n);
t:=t+1;
if n=0 then halt;
fillchar(c,sizeof(c),0);
for i:=1 to n do
begin
readln(c[i]);
end;
fillchar(a,sizeof(a),0);
for i:=1 to n do
d[i]:=1;
readln(m);
for j:=1 to m do
begin
readln(s);
k:=pos(' ',s);
s1:=copy(s,1,k-1);
delete(s,1,k);
for i:=1 to n do
if c[i]=s1 then break;
k:=pos(' ',s);
s1:=copy(s,1,k-1);
val(s1,l);
delete(s,1,k);
for kk:=1 to n do
if c[kk]=s then break;
a[j].x:=i;
a[j].y:=kk;
a[j].w:=l;
end;
end;
begin
t:=0;
while 1=1 do begin
init;
if bellman
then writeln('Case ',t,': ','Yes')
else writeln('Case ',t,': ','No');
end;
end.