找到这样一个环,使得钱能越变越多
找最长路,d[i][i],正好表示从i出发回到i的最长的路
然后找到这样一个路后判断知否存在大于1的情况
#include <bits/stdc++.h>
using namespace std;
int n;
char as[35][100];
double dd[35][35];
int findd(char k[])
{
for (int i=0;i<n;i++){
if (strcmp(as[i],k)==0) return i;
}
return -1;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int testcase=1;
while(scanf("%d",&n)!=EOF&&n){
for (int i=0;i<n;i++){
scanf("%s",as[i]);
}
int m;scanf("%d",&m);
memset(dd,0,sizeof(dd));
for (int i=0;i<n;i++){
dd[i][i]=1;
}
for (int i=0;i<m;i++){
char a[100];double b;char c[100];
scanf("%s%lf%s",a,&b,c);
int xx=findd(a);
int yy=findd(c);
dd[xx][yy]=b;
}
for (int k=0;k<n;k++){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
dd[i][j]=max(dd[i][k]*dd[k][j],dd[i][j]);
}
}
}
int ok=0;
for (int i=0;i<n;i++){
if (dd[i][i]>1){
ok=1;
break;
}
}
if (ok) printf("Case %d: Yes\n",testcase++);
else printf("Case %d: No\n",testcase++);
}
return 0;
}