uva 436 Arbitrage (II)
题意:有一种人利用不同币种的汇率,来进行盈利,比如1美元兑0.5英镑,1英镑兑10法元,1法元兑0.21美元,那么最终受益为1*0.5*10*0.21=1.05,1美元通过币种转换,赚取了0.05美元,给出币种和一些汇率,问能否进行一些兑换,获取更多的钱
分析:可以把不同币种之间的汇率抽象成一条有向边,然后求出每两点之间经过转化后的最高汇率,如果通过转化后,存在i-i的汇率大于1,说明可以赚钱,否则不可以
从一点到另一点d[i][j]=d[i][k]*d[k][j]
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<map> using namespace std; const int INF=0x3f3f3f3f; const int maxn=35; double d[maxn][maxn]; int n; void floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(d[i][j]<d[i][k]*d[k][j]) d[i][j]=d[i][k]*d[k][j]; } int main(){ int cas=1; while(~scanf("%d",&n)&&n){ map<string,int> m; for(int i=1;i<=n;i++){ string s; cin>>s; m[s]=i; } memset(d,0,sizeof(d)); for(int i=1;i<=n;i++) d[i][i]=1; int Q; scanf("%d",&Q); while(Q--){ string s1,s2;double p; cin>>s1>>p>>s2; d[m[s1]][m[s2]]=p; } floyd(); bool ok=0; for(int i=1;i<=n;i++) if(d[i][i]>1) ok=1; printf("Case %d: ",cas++); if(ok) puts("Yes"); else puts("No"); } return 0; }