NYOJ 188 Arbitrage map 建图 汇率转换

来源:互联网 发布:手机淘宝卖家怎么激活 编辑:程序博客网 时间:2024/05/29 01:54

原题链接

题目大意 :套利是利用货币汇率的差异,将一个货币单位转换成同一货币的一个以上的单位。例如,假设1美元买0.5英镑,1英镑买10法郎,而1法国法郎购买0.21美元。然后,通过转换货币,一个聪明的交易者可以从1美元和购买0.5 * 10 * 0.21 = 1.05美元,使利润为百分之5美元。

你的工作是写一个程序,以货币汇率的列表作为输入,然后确定是否套利是可能的。

用map建图,floyd

#include<stdio.h>#include<string>#include<map>using namespace std;map<string,int>mp;double a[40][40];int n;void addEdge(char str1[],double x,char str2[]){string s1=str1;string s2=str2;int u,v;u=mp[s1];v=mp[s2];a[u][v]=x;}bool floyd(){int i,j,k;for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(a[i][j]<a[i][k]*a[k][j]){a[i][j]=a[i][k]*a[k][j];}}for(i=1;i<=n;i++){if(a[i][i]>1)return true;}return false;}int main(){int m,i,j,count,t=0;double x;char str[20],str1[20],str2[20];while(scanf("%d",&n)&&n){count=0;mp.clear();getchar();for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i==j)a[i][j]=1;elsea[i][j]=0;}for(i=0;i<n;i++){scanf("%s",str);string s=str;mp[s]=++count;}scanf("%d",&m);getchar();for(i=0;i<m;i++){scanf("%s%lf%s",str1,&x,str2);addEdge(str1,x,str2);}if(floyd())printf("Case %d: Yes\n",++t);elseprintf("Case %d: No\n",++t);}return 0;}



0 0
原创粉丝点击