这道题目要注意理解题目的意思:给你一些货币的种类,然后告诉你各种货币之间的转换率,求如果一种货币能够通过不断的转换最后得到的钱比自己还大,即盈利了!
像这种字符串的,用map容器来做,会更加简单!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
using namespace std;
const int maxn=35;
double mp[maxn][maxn];
int n,m;
bool flag;
void init()
{
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(i==j)mp[i][j]=1;
else mp[i][j]=0;
}
}
}
void floyd()
{
int k,i,j;
for(k=0; k<n; k++)
{
for(i=0; i<n; i++)
{
for(j=0; j <n; j++)
{
if(mp[i][j]<mp[i][k]*mp[k][j])//这里转换率是乘,而且越大越好
{
mp[i][j]=mp[i][k]*mp[k][j];
}
}
}
}
}
int main()
{
int i,tcase;
tcase=0;
while(scanf("%d",&n),n)
{
map<string,int>r;
string s1,s2,s3;
double d;
r.clear();
init();
for(i=0; i<n; i++)
{
cin>>s1;
r[s1]=i;
}
scanf("%d",&m);
for(i=0; i<m; i++)
{
cin>>s2>>d>>s3;
mp[r[s2]][r[s3]]=d;//在这里错了好多次,直接写成mp[r[s2]][r[s3]]=mp[r[s3]][r[s2]]=d;其实错了,转换率单向的!题目可以知道
}
floyd();
flag=false;
for(i=0; i<n; i++)
{
if(mp[i][i]>1)//这里就是找到通过一些转换后,到自己本身!
{
flag=true;
break;
}
}
printf("Case %d:",++tcase);
if(flag==true)
{
printf(" Yes\n");
}
else
{
printf(" No\n");
}
}
return 0;
}