天天看點

I - Arbitrage(佛洛依德)

題意 : 給你幾種貨币匯率的關系, 讓後讓你判斷這些貨币通過這些關系能不能增值。

假設說有貨币A,貨币B和貨币C 10個A 可以換一個B , 10個B可以換一個C , 而 10個C可以換一個A (這樣子通過 A-> B , B-> C , C -> A 的這種關系就可以使A無限增多)

以下是代碼(參考kukangbin大神寫的)

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<queue>
#include<set>

using namespace std;
map<string,int> q;
double mpt[][];
int main()
{
    int n,x,k=;
    string s,ss;
    double w;
    while(cin>>n)
    {  if(n == ) break ;
        int key=;
        memset(mpt,,sizeof(mpt));
        for(int i=;i<n;i++)
        {
            cin>>s;
            q[s]=i;
            mpt[i][i]=;
        }
             cin>>x;
        for(int i=;i<x;i++)
        {
            cin>>s>> w >>ss;
            mpt[q[s]][q[ss]]=w;
        }
        for(int i=;i<n;i++)
            for(int j=;j<n;j++)
                for(int k=;k<n;k++)
                    mpt[j][k]=max(mpt[j][k],mpt[j][i] * mpt[i][k]);  /// 匯率關系 : j -> k = j -> i * i -> k
 /// 是以說根據佛洛依德的這種關系就可以推出匯率的關系,最後隻要判斷dist[i][i] 是不是大于1就可以了;
        for(int i=;i<n;i++)
            if(mpt[i][i]>)  {key=; break;}
        printf("Case %d: %s\n",++k,key?"Yes":"No");
    }

}