#include<stdio.h>
#include<string.h>
int main()
{
int n,m,i,j,k,l,r,t=0;
char s[35][30],s1[30],s2[30];
double a[35][35],c;
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
t++;
memset(a,0,sizeof(a)); //开始都初始化为0了,而不是无穷大,当然可以初始化为无穷小
for(i=1;i<=n;i++){
scanf("%s",s[i]);
a[i][i]=1.0; //自己的税率初始化为1
}
scanf("%d",&m);
while(m--){
scanf("%s%lf%s",s1,&c,s2);
l=r=0;
for(i=1;i<=n;i++){
if(strcmp(s1,s[i])==0) //存在自己对自己的兑换率,所有两个字符串可能相等
l=i;
if(strcmp(s2,s[i])==0) //之前因为加了 else 将上述情况排除了,一直wa
r=i;
if(l&&r)
break;
}
a[l][r]=c;
}
for(k=1;k<=n;k++) //Floyd算法
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][k]*a[k][j]>a[i][j]) //松弛条件
a[i][j]=a[i][k]*a[k][j];
k=0;
for(i=1;i<=n;i++)
if(a[i][i]>1){
k=1;
break;
}
if(k)
printf("Case %d: Yes\n",t);
else
printf("Case %d: No\n",t);
}
return 0;
}
poj 2240 Arbitrage (Floyd),布布扣,bubuko.com
原文地址:http://blog.csdn.net/acm_code/article/details/38084405