和POJ1860差不多,就是用bellmanford判读是否存在正环,注意的是同种货币之间也可以交换,就是说:A货币换A货币汇率是2的情况也是存在的。
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<string>
#include<math.h>
#include<queue>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<cmath>
#define INF 0x3f3f3f3f
#define MAX 1005
using namespace std;
struct node
{
int u,v;
double k;
}Map[MAX];
char str[50][100000];
int n,tot,m;
double dist[MAX];
int bellman_ford()
{
int i,j;
memset(dist,0,sizeof(dist));
dist[1]=1;
for(i=1;i<n;i++)
{
for(j=1;j<tot;j++)
{
if(dist[Map[j].v] < dist[Map[j].u] * Map[j].k)
dist[Map[j].v] = dist[Map[j].u] * Map[j].k;
}
}
for(j=1;j<tot;j++)
if(dist[Map[j].v] < dist[Map[j].u] * Map[j].k)
return 1;
return 0;
}
int main()
{
int i,j,a,b,cas=1,ok;
char str1[MAX],str2[MAX];
double num;
while(scanf("%d",&n),n)
{
tot=1;
for(i=1;i<=n;i++)
{
scanf("%s",str[i]);
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%s%lf%s",str1,&num,str2);
for(j=1;j<=n;j++)
{
if(strcmp(str[j],str1)==0)
a=j;
if(strcmp(str[j],str2)==0)
b=j;
}
Map[tot].u=a;
Map[tot].v=b;
Map[tot++].k=num;
}
ok=bellman_ford();
if(ok)
printf("Case %d: Yes\n",cas++);
else
printf("Case %d: No\n",cas++);
}
return 0;
}