题意 : 给你几种货币汇率的关系, 让后让你判断这些货币通过这些关系能不能增值。
假设说有货币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");
}
}