題意 : 給你幾種貨币匯率的關系, 讓後讓你判斷這些貨币通過這些關系能不能增值。
假設說有貨币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");
}
}