HDU1217 Arbitrage

Arbitrage

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5794    Accepted Submission(s): 2683

Problem 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 file 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

Source

University of Ulm Local Contest 1996

套汇问题,floyd变形

/*
ID: LinKArftc
PROG: 1217.cpp
LANG: C++
*/

#include <map>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <cstdio>
#include <string>
#include <utility>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define eps 1e-8
#define randin srand((unsigned int)time(NULL))
#define input freopen("input.txt","r",stdin)
#define debug(s) cout << "s = " << s << endl;
#define outstars cout << "*************" << endl;
const double PI = acos(-1.0);
const double e = exp(1.0);
const int inf = 0x3f3f3f3f;
const int INF = 0x7fffffff;
typedef long long ll;

const int maxn = 50;
int n, m;
double table[maxn][maxn];

void floyd() {
    for (int k = 1; k <= n; k ++) {
        for (int i = 1; i <= n; i ++) {
            for (int j = 1; j <= n; j ++) {
                table[i][j] = max(table[i][j], table[i][k] * table[k][j]);
            }
        }
    }
}

int main() {
    //input;
    int _t = 1;
    while (~scanf("%d", &n) && n) {
        map <string, int> mp;
        string str, str1;
        int cnt = 1;
        for (int i = 1; i <= n; i ++) {
            cin >> str;
            mp[str] = cnt ++;
        }
        memset(table, 0, sizeof(table));
        scanf("%d", &m);
        double change;
        for (int i = 1; i <= m; i ++) {
            cin >> str >> change >> str1;
            table[mp[str]][mp[str1]] = change;
        }
        floyd();
        bool flag = false;
        for (int i = 1; i <= n; i ++) {
            if (table[i][i] - 1.0 > eps) {
                flag = true;
                break;
            }
        }
        if (flag) printf("Case %d: Yes\n", _t ++);
        else printf("Case %d: No\n", _t ++);
    }

    return 0;
}
时间: 2024-11-07 10:19:18

HDU1217 Arbitrage的相关文章

HDU1217:Arbitrage(SPFA)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意 在每种钱币间进行各种交换,最后换回自己如果能赚,那么就Yes,否则No 注意应为有负权所以dijsktra在这里行不通了可以用国产的spfa算法,可比bfs. 我的AC代码 #include<iostream>#include<cstdio>#include<cstring>#include<map>#include<queue>us

HDU1217 Arbitrage 【SPFA】

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4460    Accepted Submission(s): 2032 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

hdu1217——Arbitrage

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4840    Accepted Submission(s): 2204 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

poj2240——Arbitrage(Bellman-Ford算法)

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 Fre

HDU 1217 Arbitrage 【最短路,map+spfa】

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6985    Accepted Submission(s): 3212 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

hdu 1217 Arbitrage(佛洛依德)

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6360    Accepted Submission(s): 2939 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform o

HDOJ 1217 Arbitrage(拟最短路,floyd算法)

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5679    Accepted Submission(s): 2630 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

Arbitrage - poj 2240 (Bellman-ford)

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17374   Accepted: 7312 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 exa

【组队赛#5】BNU 4291 Arbitrage? (floyd最短路 map映射)

[题目链接]click here~~ [题目大意]去多个国家旅游,给定国与国之间汇率的转化率,如果从起点出发最后回到起点,有收益则符合,否则不符合 [解题思路] 判一次环,用floyd计算距离最短的而且转换率最大的,map<string ,int >映射  <字符串--点> 代码 /* BNUOJ 4291 Arbitrage? Author :HRW 判一次环,用floyd计算距离最短的而且转换率最大的 map<string ,int >映射 <字符串--点&g