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[50][50];
int main()
{
    int n,x,k=0;
    string s,ss;
    double w;
    while(cin>>n)
    {  if(n == 0) break ;
        int key=0;
        memset(mpt,0,sizeof(mpt));
        for(int i=0;i<n;i++)
        {
            cin>>s;
            q[s]=i;
            mpt[i][i]=1;
        }
             cin>>x;
        for(int i=0;i<x;i++)
        {
            cin>>s>> w >>ss;
            mpt[q[s]][q[ss]]=w;
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                for(int k=0;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=0;i<n;i++)
            if(mpt[i][i]>1)  {key=1; break;}
        printf("Case %d: %s\n",++k,key?"Yes":"No");
    }

}

猜你喜欢

转载自blog.csdn.net/qq_42894605/article/details/81706927
I