关闭

poj 2240 Arbitrage

标签: 最短路径mapspfa算法
220人阅读 评论(0) 收藏 举报
分类:
Arbitrage
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 18606   Accepted: 7855

Description

Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 French francs, and 1 French franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent.

Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.

Input

The input will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within a name no spaces will appear. The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name cj of the destination currency. Exchanges which do not appear in the table are impossible.
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.

Output

For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".

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

套汇问题,spfa算法。

#include<iostream>
using namespace std;
#include<string.h>
#include<stdio.h>
#include<queue>
#define maxn 0x7fffffff
#include<map>
int n,m,f;
double dis[3000];
int vis[3000],head[3000];
struct node
{
    double w;
    int e,next;
}edge[3000];
void add(int s,int e,double w)
{
    edge[f].e=e;
    edge[f].w=w;
    edge[f].next=head[s];
    head[s]=f++;
}
int spfa(int s)
{
    int cur,k,i;
    queue<int>q;
    while(!q.empty())
    {
        q.pop();
    }
    q.push(s);
    dis[s]=1;
    vis[s]=1;
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
        vis[cur]=0;
        for(i=head[cur];i!=-1;i=edge[i].next)
        {
            k=edge[i].e;
           if(dis[k]<dis[cur]*edge[i].w)
           {
               dis[k]=dis[cur]*edge[i].w;
               if(!vis[k])
               {
                   q.push(k);
                   vis[k]=1;
               }
           }
           if(dis[s]>1)
            return 1;
        }
    }
    return 0;
}
int main()
{
     int i,j=1;
     double w;
     char s[100],s1[100],s2[100];
     map<string,int>v;
     while(cin>>n)
     { if(n==0)break;
         f=0;
         memset(vis,0,sizeof(vis));
         memset(head,-1,sizeof(head));
     for(i=0;i<100;i++)
        dis[i]=0;
     for(i=1;i<=n;i++)
     {
         cin>>s;
         v[s]=i;
     }
      cin>>m;
      for(i=0;i<m;i++)
      {
          cin>>s1>>w>>s2;
          add(v[s1],v[s2],w);
      }
      cout<<"Case "<<j<<": ";
      for(i=1;i<=n;i++)
      {
          if(spfa(i))
         {
            cout<<"Yes\n";
            break;
         }
      }
      if(i==n+1)
      cout<<"No\n";
        j++;
     }
    return 0;
}


0
0
查看评论

poj2240 Arbitrage (spfa判环)

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10997   Accepted: 4622 Description Arbitr...
  • su20145104009
  • su20145104009
  • 2016-03-20 18:42
  • 2422

poj2240Arbitrage(最短路floyd)

这个题目是换钱和另一个有点类似,只不过这个没有手续费,这道题在读入的时候有点麻烦,我用的map和string,剩下的就好说了,看钱会不会变多,它没说从哪种变成哪种,那么就得是多源最短路用floyd,里面是汇率用乘法,然后看看是不是比原来的多就可以了#include <iostream> ...
  • zcmartin2014214283
  • zcmartin2014214283
  • 2016-05-30 12:19
  • 242

poj-2240-Arbitrage(Bellman-ford算法练习 + Floyd算法练习)

poj-2240-Arbitrage(Bellman-ford算法练习 + Floyd算法练习)
  • sinat_34263473
  • sinat_34263473
  • 2016-08-08 20:38
  • 864

POJ 2240 Arbitrage Bellman_ford

F - Arbitrage Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more tha...
  • AC_road
  • AC_road
  • 2015-08-03 11:34
  • 181

poj 2240 Arbitrage 最短路

其实就是找到乘积最大的一条回路,如果大于1就是YES否则就是NO,用bellman N4都能过…… /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please ind...
  • czjxy881
  • czjxy881
  • 2013-02-13 23:19
  • 236

poj 2240:Arbitrage

解题思路: floyd算法
  • u010663294
  • u010663294
  • 2014-07-07 19:16
  • 269

【POJ 2240】 Arbitrage

【POJ 2240】Arbitrage
  • ChallengerRumble
  • ChallengerRumble
  • 2015-06-29 15:00
  • 664

poj 2240 Arbitrage 【floyd】

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18817   Accepted: 7964 ...
  • nuanxin_520
  • nuanxin_520
  • 2016-01-09 16:01
  • 131

POJ 2240 Arbitrage(Floyd)

POJ 2240 Arbitrage(Floyd) http://poj.org/problem?id=2240 题意:给你一些货币比如A,B,C,然后给你他们之间存在的对换关系,如A可以换0.5个B,B可以换10个C,C可以换2个A等.然后问你是否存在一种对换可以使得1个A可以换到大于1个A的钱....
  • u013480600
  • u013480600
  • 2014-07-09 22:49
  • 740

POJ 2240 Arbitrage (Floyd)

也是一道资金兑换的题..直接按照比例兑就可以了考虑Floyd算法.但是Floyd稍微有些修改,加法改为乘法,使该点到其他点汇率最大最终要换回自己d[i][j]是i换j的最大汇率,而d[j][i]则是j换回i的最大汇率,所以最后只要枚举d[i][j]*d[j][i]即可,看是否有结
  • swm8023
  • swm8023
  • 2011-07-29 00:25
  • 472
    个人资料
    • 访问:54338次
    • 积分:1912
    • 等级:
    • 排名:千里之外
    • 原创:138篇
    • 转载:7篇
    • 译文:0篇
    • 评论:15条
    最新评论