Hdu 1217 Arbitrage

大意:通过货币的兑换去套利,若能套利则输出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;
}

 

你可能感兴趣的:(HDU)