Flody的变形,初始化所有d[i][i] = 1,其他为0。 这样在Flody的时候取大就行了。 然后检查所有点d[i][i]是否有大于1的。
细节参见代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const double INF = 1000000000;
const int maxn = 30 + 5;
int n,m,kase = 0,id1,id2;
double d[maxn][maxn],v;
bool solve() {
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j] = max(d[i][j],d[i][k]*d[k][j]);
for(int i=1;i<=n;i++)
if(d[i][i] > 1.0) return true;
return false;
}
map<string,int> p;
char s1[10000],s2[10000];
int main() {
while(~scanf("%d",&n)&&n) {
p.clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) d[i][j] = (i == j ? 1 : 0);
for(int i=1;i<=n;i++) {
scanf("%s",s1);
p[s1] = i;
}
scanf("%d",&m);
for(int i=0;i<m;i++) {
scanf("%s%lf%s",s1,&v,s2);
id1 = p[s1];
id2 = p[s2];
d[id1][id2] = v;
}
if(solve()) printf("Case %d: Yes\n",++kase);
else printf("Case %d: No\n",++kase);
}
return 0;
}