POJ 2240 Arbitrage

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

题意:知道货币的名字和每两种货币兑换的利率,那么现在要判断当每种货币经过一系列兑换之后再次回到该种货币时价值是否增加。(和POJ 1860 Currency Exchange一样,只是要找到货币名称所对应的下标)
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;

const int N=50;
const int INF=0x3f3f3f3f;

struct node
{
    char s[110];
}no[N];
double G[N][N], dist[N];
int vis[N], cou[N], n;

void Init()
{
    int i, j;

    for (i = 1; i <= n; i++)
    {
        dist[i] = -INF;
        vis[i] = cou[i] = 0;
        for (j = 1; j <= n; j++)
            G[i][j] = -INF;
        G[i][i] = 0;
    }
}

int Judge(char a[]) ///找到字符串a的下标
{
    int i;

    for (i = 1; i <= n; i++)
    {
        if (strcmp(a, no[i].s) == 0)
            return i;
    }

    return -1;
}

int Spfa()
{
    int i, v;
    queue<int>Q;

    Q.push(1);
    dist[1] = 1;

    while (!Q.empty())
    {
        v = Q.front(); Q.pop();

        for (i = 1; i <= n; i++)
        {
            if (dist[i] < dist[v]*G[v][i])
            {
                dist[i] = dist[v]*G[v][i];

                if (!vis[i])
                {
                    Q.push(i);
                    vis[i] = 1;
                    cou[i]++;
                    if (cou[i] >= n) ///有回路代表货币价值增加,因为只有货币兑换后价值增加才会进行这一步
                        return 1;
                }
            }
        }

        vis[v] = 0;
    }

    return 0;
}

int main ()
{
    int i, j, m, ans, k = 0;
    char a[110], b[110];
    double d;

    while (scanf("%d", &n), n)
    {
        Init();
        k++;

        for (i = 1; i <= n; i++)
            scanf("%s", no[i].s);
        scanf("%d", &m);
        while (m--)
        {
            scanf("%s %lf %s", a, &d, b);

            i = Judge(a);
            j = Judge(b);
            G[i][j] = d;
        }

        ans = Spfa();

        if (ans) printf("Case %d: Yes\n", k);
        else printf("Case %d: No\n", k);
    }

    return 0;
}
posted @ 2015-09-16 16:31  搁浅の记忆  阅读(216)  评论(0编辑  收藏  举报