做法与POJ1860一样
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1000;
int n,m;
double sum[maxn]; //sum[i]表示当前货币在第i种货币下的价值
struct Edge
{
int s;
int t;
double r;
}edge[maxn];
bool Bellman_Ford()
{
int i,j;
sum[0]=1;
for(i=1;i<n;i++)
for(j=0;j<m;j++) //枚举每一条边,并作适当调整
if(sum[edge[j].t]<sum[edge[j].s]*edge[j].r)
sum[edge[j].t]=sum[edge[j].s]*edge[j].r;
for(i=0;i<m;i++)
if(sum[edge[i].t]<sum[edge[i].s]*edge[i].r)
return true;
return false;
}
int main()
{
int i,j,a,b,cas,l,r;
double rat;
char first[30],last[30],str[32][30];
cas=1;
while(scanf("%d",&n) && n)
{
for(i=0;i<n;i++)
scanf("%s",str[i]);
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%s%lf%s",first,&rat,last);
for(j=0;j<n;j++)
{
if(strcmp(str[j],first)==0)
l=j;
if(strcmp(str[j],last)==0)
r=j;
}
edge[i].s=l;
edge[i].t=r;
edge[i].r=rat;
}
memset(sum,0,sizeof(sum));
printf("Case %d: ",cas++);
if(Bellman_Ford())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}