[2016-04-05][POJ][2240][Arbitrage]

  • 时间:2016-04-05 10:00:40 星期二

  • 题目编号:[2016-04-05][POJ][2240][Arbitrage]

  • 题目大意:给定n种货币,和m种对换比例,是否能通过兑换货币而获利

  • 分析:

    • n < 30,所以直接floyd
  1. #include <map>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <string>
  6. using namespace std;
  7. const int maxn = 30 + 5;
  8. double d[maxn][maxn];
  9. int main(){
  10. map<string ,int> m;
  11. int n,_m,cntcase = 0;
  12. string str,str2;
  13. double rij;
  14. while(cin>>n && n){
  15. for(int i = 1;i <= n ; ++i){
  16. cin>>str;
  17. m[str] = i;
  18. }
  19. cin>>_m;
  20. memset(d,0,sizeof(d));
  21. for(int i = 0;i < _m ; ++i){
  22. cin>>str>>rij>>str2;
  23. d[m[str]][m[str2]] = rij;
  24. }
  25. //floyd
  26. for(int k = 1; k <= n ; ++k)
  27. for(int i = 1; i <= n ; ++i)
  28. for(int j = 1;j <= n ; ++j)
  29. d[i][j] = max(d[i][j],d[i][k]*d[k][j]);
  30. printf("Case %d: ",++cntcase);
  31. int flg = 0;
  32. for(int i = 1;i <=n ;++i){
  33. if(d[i][i] > 1.0){
  34. flg = 1;break;
  35. }
  36. }
  37. if(flg) puts("Yes");
  38. else puts("No");
  39. }
  40. return 0;
  41. }


来自为知笔记(Wiz)


posted on 2016-04-05 12:47  红洋  阅读(109)  评论(0)    收藏  举报

导航