又是一道大坑题!!
居然货币可以兑换同一种还是升值的!
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
double dict[35];
char str[100][35];
int n,m;
struct Edge {
int l,r;
double value;
} edge[1000];
bool bellman() {
memset(dict,0,sizeof(dict));
dict[1] = 100.0;
for(int i = 1;i < n;i++) {
bool flag = true;
for(int j = 1;j <= m;j++) {
int l = edge[j].l;
int r = edge[j].r;
double value = edge[j].value;
//printf("%d-%d-%.3f\n",l,r,value);
//printf("%.3f %.3f\n",dict[l]*value,dict[r]);
if(dict[l]*value - dict[r] > 0.0000001 && dict[l] != 0) {
dict[r] = dict[l]*value;
flag = false;
}
}
if(flag) return false;
}
for(int i = 1;i <= m;i++)
if(dict[edge[i].l]*edge[i].value - dict[edge[i].r] > 0.0000001)
return true;
return false;
}
int main() {
int t = 1;
while(~scanf("%d",&n) && n) {
for(int i = 1;i <= n;i++) {
scanf("%s",str[i]);
}
scanf("%d",&m);
char str1[100],str2[100];
int l,r;
double tt;
/*memset(dict,0,sizeof(dict));
dict[1] = 100.0;*/
for(int j = 1;j <= m;j++) {
scanf("%s%lf%s",str1,&tt,str2);
for(int i = 1;i <= n;i++) {
if(strcmp(str[i],str1) == 0)
l = i;
if(strcmp(str[i],str2) == 0)//不能else if 因为可以同一种货币!坑了一晚上
r = i;
}
edge[j].l = l;
edge[j].r = r;
edge[j].value = tt;
}
if(bellman())
printf("Case %d: Yes\n",t++);
else
printf("Case %d: No\n",t++);
}
return 0;
}