/*题意:几种不同的物品可以互相交换,但是交换的数量不同
比如:
1 单位 US 换 0.5 单位 British
1 单位 British 换 10.0 单位 French
1 单位 French 换 0.21 单位 US
现在我们可以用 1单位US 换 0.5 单位British;
再用这 0.5单位British 换 5 单位French
再用 5单位French 换 1.05 单位US
那么一开始的1单位的US现在就变成了1.05单位US;
获利0.05US
题目给出所有可供交换的物品和两种可以交换的物品之间的交换价格
问是否可以通过交换获利
*/
/*题解:先用map映照把不同的物品编号,再存入邻接矩阵
邻接矩阵必须先初始化
然后用floyd求出各个物品可以通过交换得到的最大值,
再找出每个物品自身的交换后的价值,如果大于原来的价值就输出Yes;
否则输出No
*/
#include<stdio.h>
#include<map>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
map<string,int>m; //map映照容器,用字符串映照数字
int t,n,ans;
int flag;
int r=1;
double mp[222][222]; //邻接矩阵用double型储存
double x;
char str1[222],str2[222];
char str[222];
while(scanf("%d",&n) && n)
{
for(int i=1; i<=n; i++)
{
scanf("%s",str);
m[str] = i; //输入字符串,确定映照的数字
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i==j)
mp[i][j] = 0.00; //初始化邻接矩阵mp
else
mp[i][j] = 1.00;
}
}
scanf("%d",&t);
for(int i=0; i<t; i++)
{
scanf("%s %lf %s",&str1,&x,&str2); //储存路径
mp[m[str1]][m[str2]] = x;
}
//floyd
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
for(int k=1; k<=n; k++)
{
if(mp[j][k] < mp[j][i] * mp[i][k])
{
mp[j][k] = mp[j][i]*mp[i][k];
}
}
}
}
printf("Case %d: ",r++);
flag = 0;
for(int i=1; i<=n; i++)
{
if(mp[i][i] > 1) //对比交换后的价值是否变大
{
flag = 1;
printf("Yes\n");
break;
}
}
if(!flag)
printf("No\n");
}
}