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
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
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- floyd 算法
- Floyd算法
- floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- 职业规划
- java object之clone
- Android之Volley
- leetcode第十四题(easy)——Longest Common Prefix
- SDKD 14级组队练习赛(一) D 数组存储二叉树并递归遍历
- floyd算法
- Java基础-Class类
- MySQL与Oracle 数据类型比较
- setTimeout()中函数加双引号和不加有什么区别?
- 社説 20150517 米軍オスプレイ 横田配備で即応力が向上する
- 详解 /etc/group
- 设备IO之一(mmap、直接IO以及异步IO)
- 临时解决windows 时间变成了nn 分钟
- Android自定义摇杆实现蓝牙控制小车