Arbitrage poj 2240 最长路找正环

题目大意

给出一些货币和货币之间的兑换比率,问是否可以使某种货币经过一些列兑换之后,货币值增加。举例说就是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.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值