POJ2240 Arbitrage(flyod解决)

题目描述

Arbitrage
有些人会利用货币的不用汇率来进行套现,比如1美元换0.5英镑,而1英镑又可以换10法郎,而1法郎又可以换0.21的美元,那么经过货币的汇率转换后,它就可以获得1.05倍原来的美元。
现在给你N中货币,m种货币的汇率,求是否可以获利。

题目思路

  • 货币名称映射到i
  • flyod后看对角线元素(看能不能换到更多的自己,比如美元可以换到1.05倍的美元)
  • flyod模板可见我博客最短路径 flyod模板

代码

#include <iostream>
#include <stdio.h>
#include<map>
#include<string>
#include<string.h>
using namespace std; 
#define max 100
float dis[max][max];
int main() {
    freopen("in.txt","r",stdin);
    //名称和i的映射
    map<string,int> currencies;
    int n,m,casenum=0;
    while(1){
        cin>>n;
        if(n==0){
            break;
        }
        casenum+=1;
        string name;
        for(int i=1;i<=n;i++){
            cin>>name;
            currencies[name]=i;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i==j) dis[i][j]=1;
                else dis[i][j]=0;
            }
        }
        cin>>m;
        string name1,name2;
        float rate;
        for(int i=1;i<=m;i++){
            cin>>name1>>rate>>name2;
            dis[currencies[name1]][currencies[name2]]=rate;
        }
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(dis[i][j]<dis[i][k]*dis[k][j]){
                        dis[i][j]=dis[i][k]*dis[k][j];
                    }
                }
            }
        }
        //判断对角线
        int flag=0;
        for(int i=1;i<=n;i++){
            if(dis[i][i]>1){
                flag=1;
            }
        }
        if(flag){
            cout<<"Case "<<casenum<<": Yes"<<endl;
        }else{
            cout<<"Case "<<casenum<<": No"<<endl;
        }
    }
    fclose(stdin);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/armstrong_rose/article/details/80337099