大意:通过货币的兑换去套利,若能套利则输出Yes,否则输出No。

思路:通过Floyd算法算出的d[i][i]即每种货币能不能套利,只要存在一种则输出Yes。数据的处理通过STL中的map容器去处理。

 

CODE:

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
using namespace std;

const int SIZE = 34;
double d[SIZE][SIZE];
map<stringint> hash;         //map容器
int n, m;
int cnt, flag;


void Floyd()
{
    int i, j, k;
    for(k = 1; k <= n; k++)
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            d[i][j] >?= d[i][k] * d[k][j];
    double max = -1;
    for(i = 1; i <= n; i++)    max >?= d[i][i];
    if(max > 1) puts("Yes");
    else puts("No");
}


void init()
{
    memset(d, 0sizeof(d));
    hash.clear();
    cnt = flag = 0;
}


int main()
{
    int times = 0;
    char str[SIZE];
    while(~scanf("%d", &n), n)
    {
        init();
        for(int i = 1; i <= n; i++)              //用while(n--)会影响后面的结果。 
        {
            scanf("%s", str);
            if(!hash[str]) hash[str] = ++cnt;   //map的数据处理
        }
        scanf("%d", &m);
        for(int i = 1; i <= m; i++)
        {
            double cost;
            char sz1[SIZE], sz2[SIZE];
            scanf("%s%lf%s", sz1, &cost, sz2);
            int x = hash[sz1];
            int y = hash[sz2];
            d[x][y] = cost;
            if(x == y && cost > 1) flag = 1;
        }
        printf("Case %d: ", ++times);
        if(flag)    printf("Yes\n");
        else 
        {
            Floyd();
        }
    }
    return 0;
}

 

posted on 2012-08-31 11:02  有间博客  阅读(257)  评论(0编辑  收藏  举报