POJ - 2240 Arbitrage(Floyd)

题目链接:http://poj.org/problem?id=2240

#include <iostream>
#include <cstring>
#include <string>
#include <map>
using namespace std;
/****************************************************************************************************************
            题意:给定 N 种货币以及货币之间的汇率,问是否通过兑换可以赚钱
            思路:
            1,利用floyd求每两个点最短路的思想,更新每两种货币之间兑换情况
            2,当 Map[i][i] > 1,即通过兑换之后货币本身之间的兑换率 > 1,那么就是赚钱了
            3,更新时注意汇率是乘运算,不是加运算
            4,最后遍历每种货币,有赚钱情况输出Yes,否则输出No.
****************************************************************************************************************/
double Map[35][35];
map <string ,int> name;
int main()
{
    int m,n;
    int num=1;
    while(cin>>n,n!=0)
    {
        name.clear();
        memset(Map,0,sizeof(Map));
        for(int i = 1;i <= n;i ++)
            Map[i][i]=1;

        string s;
        for(int i = 1;i <= n;i ++){
            cin>>s;
            name[s]=i;
        }
        cin>>m;
        string s1,s2;
        double rate;
        while(m--)
        {
            cin>>s1>>rate>>s2;
            Map[name[s1]][name[s2]]=rate;
        }

        for(int k = 1;k <= n;k ++)
            for(int i = 1;i <= n;i ++)
                for(int j = 1;j <= n;j ++)
                    if(Map[i][k] && Map[i][j] < Map[i][k]*Map[k][j])
                        Map[i][j]=Map[i][k]*Map[k][j];

        int flag=0;
        for(int i = 1;i <= n;i ++){     //遍历所有货币情况
            if(Map[i][i] > 1){
                flag=1;
                break;
            }
        }
        if(flag)
            cout<<"Case "<<num++<<": Yes"<<endl;
        else
            cout<<"Case "<<num++<<": No"<<endl;
    }
    return 0;
}



 

posted on 2016-05-01 23:14  Jstyle  阅读(116)  评论(0编辑  收藏  举报

导航