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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章