floyd算法

来源:互联网 发布:linux cp命令 时间 编辑:程序博客网 时间:2024/04/28 00:27

floyd算法

     形式感觉就是动态规划吧....

核心代码如下:

procedure floyd;var i,j,k:longint;begin  for k:=0 to n do   for i:=0 to n do    for j:=0 to n do    q[i,j]:=max(q[i,j],q[i,k]+q[k,j]);//适情况而定end;   


例题:

Description

套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币。例如,假定1 美元可以买0.7 英镑,1 英镑可以买9.5 法郎,且1 法郎可以买到0.16美元。通过货币兑换,一个商人可以从1 美元开始买入,得到0.7×9.5×0.16=1.064美元,从而获得6.4%的利润。 

编程任务: 
给定n种货币C1,C2,…,Cn的有关兑换率,试设计一个有效算法,用以确定是否存在套汇的可能性。 

Input

输入数据包括多组测试数据,请处理到EOF结束。每个测试数据项的第一行中有1个整数n (1<=n<=30),表示货币总数。其后n行给出n种货币的名称(长度小于20位,不包含空格、回车、table键等空白字符)。接下来的一行中有1个整数m,表示有m种不同的货币兑换率。其后m行给出m种不同的货币兑换率,每行有3 个数据项Ci,Rij 和Cj,表示货币Ci 和Cj的兑换率为 Rij (0<=Rij<=1)。每组输入数据后有一个空行。

Output

对每个测试数据项j,如果存在套汇的可能性则输出“Case j: Yes”, 否则输出“Case j: No”。

Sample Input

3USDollarBritishPoundFrenchFranc3USDollar 0.5 BritishPoundBritishPound 10.0 FrenchFrancFrenchFranc 0.21 USDollar 3USDollarBritishPoundFrenchFranc6USDollar 0.5 BritishPoundUSDollar 4.9 FrenchFrancBritishPound 10.0 FrenchFrancBritishPound 1.99 USDollarFrenchFranc 0.09 BritishPoundFrenchFranc 0.19 USDollar

Sample Output

Case 1: YesCase 2: No


AC代码

var n,m,tot:longint;  name,use,f,t:array[1..1000]of ansistring;  q:array[0..100,0..100]of longint;function get(x:ansistring):longint;var ii:longint;begin   for ii:=1 to n do   if x=name[ii]then exit(ii);end;function max(x,y:longint):longint;begin   if x>y then exit(x)   else exit(y);end;procedure readdata;var ii,jj,code,tempf,tempt:longint;  temp:ansistring;   temp1:real;begin   inc(tot);   fillchar(q,sizeof(q),0);   fillchar(name,sizeof(name),0);   fillchar(use,sizeof(use),0);   fillchar(f,sizeof(f),0);   fillchar(t,sizeof(t),0);   readln(n);   for ii:=1 to n do   readln(name[ii]);   for ii:=0 to n do    q[ii,ii]:=1;   readln(m);   for ii:=1 to m do   begin     readln(use[ii]);     jj:=1;     while use[ii][jj]<>' 'do inc(jj);     f[ii]:=copy(use[ii],1,jj-1);     inc(jj);     while use[ii][jj]<>' 'do inc(jj);     temp:=copy(use[ii],length(f[ii])+2,jj-(length(f[ii])+2));     val(temp,temp1,code);     t[ii]:=copy(use[ii],jj+1,length(use[ii])-jj);     tempf:=get(f[ii]);tempt:=get(t[ii]);     if q[tempf,tempt]<trunc(temp1*1000) then     q[tempf,tempt]:=trunc(temp1*1000);   end;end;function floyd:boolean;var i,j,k:longint;begin  for k:=0 to n do   for i:=0 to n do    for j:=0 to n do    q[i,j]:=max(q[i,j],trunc((q[i,k]*q[k,j])/1000)); //高精度小数的处理,避免溢出  for i:=0 to n do  if (q[i,i]>1000)then exit(true);    exit(false);end;beginwhile not eof dobegin  readdata;  if floyd then writeln('Case ',tot,': Yes')  else writeln('Case ',tot,': No');  readln;end;end.



     

0 0