代码实现:
#include<cstdio>
#include<map>
#include<string>
#define max(a,b) (a>b?a:b)
using namespace std;
double w[35][35];
int n,m;
map<string,int>my_map;
void Floyd(){
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
if(w[i][k]!=-1&&w[k][j]!=-1)
w[i][j]=max(w[i][k]*w[k][j],w[i][j]);
}
}
}
int main(){
int cnt=0;
while(~scanf("%d",&n),n){
cnt++;
char name1[30],name2[30];
double r;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
w[i][j]=-1;
w[i][i]=1.0;
}
for(int i=0;i<n;i++){
scanf("%s",name1);
my_map[name1]=i;
}
scanf("%d",&m);
while(m--){
scanf("%s %lf %s",name1,&r,name2);
w[my_map[name1]][my_map[name2]]=r;
}
Floyd();
int flag=0;
for(int i=0;i<n;i++){
if(w[i][i]>1.0){
flag=1;
break;
}
}
printf("Case %d: ",cnt);
if(flag==1) printf("Yes\n");
else printf("No\n");
}
}