和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 ",cas++); else printf("Case %d: No ",cas++); } return 0; }