poj 2240 Arbitrage

原创 2016年05月31日 18:15:38

C - Arbitrage
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

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

题意:

套汇

有n个国家之间的汇率,1<=n<=30,一个人他有一个国家的钱币,然后题目给出某些国家之间的汇率,问我们套汇后是否赚取利润。

思路:

本题是有向图,a国对b国的汇率并不等于b国对a国的汇率的倒数。

这道题是有环的,设他拥有的货币为1,求经过一个环后所得钱是否比原来的高。

有floyd或者spfa都可以。

//floyd

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <cmath>
#include <string>
#include <map>
#define N 50
#define inf 1<<29
using namespace std;
//poj 2240 有向图
//有可能增加即可
double e[N][N];
map <string,int> cur;//字符串与数字一一对应
//初始化
void init(int n)
{
    int i, j, m;
    double c;
    string a, b;
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= n; j++)
            e[i][j] = 0;
        e[i][i] = 1;//记录利率,自身利率为 1
    }
    for(i = 1; i <= n; i++)
    {
        cin >> a;
        cur[a] = i;//记录进map里
    }
    scanf("%d", &m);
    while(m-->0)
    {
        cin >> a >> c >> b;
        if(e[cur[a]][cur[b]] < c)
            e[cur[a]][cur[b]] = c;//单向的
    }
}
//floyd
void floyd(int n)
{
    int i, j, k;
    for(k = 1; k <= n; k++)
        for(i = 1; i <= n; i++)
            for(j = 1; j <= n; j++)
                if(e[i][j] < e[i][k] * e[k][j])//”+“变“*”,最短路的变形
                    e[i][j] = e[i][k] * e[k][j];

}
int main()
{
    int no = 0;
    int i, j;
    int n;
    int c;

    while(scanf("%d", &n) && n)
    {
        int flag = 0;
        init(n);
        floyd(n);
        for(i = 1; i <= n; i++)
            if(e[i][i] > 1)//只要有可能性就是Yes
            {
                flag = 1;
                break;
            }
        if(flag)
            printf("Case %d: Yes\n", ++no);
        else
            printf("Case %d: No\n", ++no);
    }
    return 0;
}

//spfa+slf

Time Limit Exceeded......修改中......

//spfa+slf
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <cmath>
#include <string>
#include <deque>
#include <map>
#define N 50
#define inf 1<<29
using namespace std;
//poj 2240 有向图
//spfa+slf
int vis[N];
int head[N];
double dis[N];
map <string,int> cur;
struct{
    int v;
    double c;
    int next;
}e[N*2];
void init(int n)
{
    int i, m;
    char a[15], b[15];
    double c;
    memset(head, -1, sizeof(head));
    for(i = 1; i <= n; i++)
    {
        scanf("%s", a);
        cur[a] = i;
    }
    scanf("%d", &m);
    for(i = 1; i <= m; i++)
    {
        scanf("%s %lf %s", a, &c, b);
        e[i].v = cur[b];
        e[i].c = c;
        e[i].next = head[cur[a]];
        head[cur[a]] = i;
    }
}
bool spfa(int n, int s)
{
    memset(vis, 0, sizeof(vis));
    memset(dis, 0, sizeof(dis));
    dis[s] = 1;//到自身的距离为1
    deque<int>Q;
    Q.push_back(s);
    while(!Q.empty())
    {
        int t = Q.front();
        Q.pop_front();
        vis[t] = 0;
        for(int i = head[t]; i != -1; i = e[i].next)
        {
            int u = e[i].v;
            if(dis[u] < dis[t] * e[i].c)
            {
                dis[u]  = dis[t] * e[i].c;
                if(dis[s] > 1)
                    return 1;
                if(!vis[u])
                {
                    vis[u] = 1;
                    if(!Q.empty())
                    {
                        if(dis[u] > dis[Q.front()])
                            Q.push_back(u);
                        else
                            Q.push_front(u);
                    }
                    else
                        Q.push_back(u);
                }
            }
        }
    }
    return 0;
}
int main()
{
    int n, i;
    int ca = 0;
    int flag;

    while(scanf("%d", &n) && n)
    {
        init(n);
        flag = 0;
        for(i = 1; i <= n; i++)
        {
            if(spfa(n,i))
            {
                flag = 1;
                break;
            }
        }
        if(flag)
            printf("Case %d: Yes\n", ++ca);
        else
            printf("Case %d: No\n", ++ca);
    }
    return 0;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 2240 Arbitrage(最短路径)

Arbitrage 点击打开题目链接 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1...
  • u012860428
  • u012860428
  • 2014年09月11日 15:02
  • 537

POJ 题目2240 Arbitrage(最短路变形)

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16618   Acc...
  • yu_ch_sh
  • yu_ch_sh
  • 2015年02月24日 16:42
  • 309

poj 2240 Arbitrage ([kuangbin带你飞]专题四 最短路练习)

Description Arbitrage is the use of discrepancies in currency exchange rates to transform one uni...
  • HAHAAC
  • HAHAAC
  • 2016年11月02日 18:33
  • 222

poj 2240 Arbitrage 【最短路】 【更新:用STL map处理字符串】

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17170   Accepted: 7248 ...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年05月28日 22:20
  • 289

POJ 2240 Arbitrage 最短路正环存在问题

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66569#problem/I 题意:Arbitrage,意思为套利交易:有多个...
  • I_am_a_winer
  • I_am_a_winer
  • 2015年04月20日 14:27
  • 437

POJ - 2240(Arbitrage)弗洛伊德 变形 get最长路

///题意:我们知道每个国家的汇率是不一样的,所以呢我们可以通过不同的交换从中获取牟利, ///假设1美元买0.5英镑,1英镑买10法郎,1法郎买0.21美元。 ///然后,通过转换货币,一个聪明的交...
  • hypHuangYanPing
  • hypHuangYanPing
  • 2017年11月21日 15:10
  • 101

POJ分类很好很有层次感

OJ上的一些水题(可用来练手和增加自信)  (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: ...
  • zzycsx
  • zzycsx
  • 2015年10月13日 20:19
  • 10885

POJ题目刷题路线

转载地址:http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html 初期: 一.基本算法: (1)枚举. (poj1753,...
  • u014575047
  • u014575047
  • 2016年05月21日 17:47
  • 358

POJ 2240 最短路

最短路 找环路积大于1的 用bellman做的   #include #include #include #include #include #include #include ...
  • livenls
  • livenls
  • 2013年08月17日 23:07
  • 249

poj 2240 最短路

2015/1/29 无脑for for for.的最短路 一开始用map把货币名hash下就好。 (= =某沙比,输出了YES,NO,然后....“算法没错啊”....) ...
  • u014204854
  • u014204854
  • 2015年01月29日 08:41
  • 363
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2240 Arbitrage
举报原因:
原因补充:

(最多只允许输入30个字)