Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 18275 | Accepted: 7738 |
Description
Input
Output
Sample Input
3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0
Sample Output
Case 1: Yes Case 2: No
告诉一些货币之间兑换的汇率,问是否存在某种兑换方式,使得钱越变越多
我们假设最开始有1单位货币,枚举以每个类型货币为起点,尝试兑换,这个问题可以转化为求是否存在连续乘积大于1的回路,可以直接用bellmanford求解问题
#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; char name[222][222]; char b[222],a[222]; int n; int m; double x; int flag; double dis[2222]; struct Node { int u,v; double w; }f[2222]; void bellmanford(int x) { memset(dis,0,sizeof dis); dis[x]=1.0; for(int i=1;i<=n;i++)//操作n次 { for(int j=1;j<=m;j++) { dis[f[j].v]=max(dis[f[j].v],dis[f[j].u]*f[j].w); } } if(dis[x]>1.0) flag=1; } int main() { int ca=1; while(scanf("%d",&n),n) { for(int i=1;i<=n;i++) scanf("%s",name[i]); scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%s %lf %s",a,&x,b); int j,k; for(j=1; strcmp(a,name[j]); j++) ; for(k=1; strcmp(b,name[k]); k++) ; f[i].u=j; f[i].v=k; f[i].w=x; } flag=0; for(int i=1;i<=n;i++) { bellmanford(i); if(flag) break; } printf("Case %d: ",ca++); if(flag) puts("Yes"); else puts("No"); } return 0; }