题目 : http://acm.tju.edu.cn/toj/showp1129.html
(弗洛伊德算法)
#include "cstdio"
#include "string"
#include "cstring"
#include "map"
using namespace std;
double g[31][31];
map<string, int> M;
int n, m;
bool check() {
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (g[i][k] * g[k][j] > g[i][j])
g[i][j] = g[i][k] * g[k][j];
for (int i = 1; i <= n; i++)
if (g[i][i] > 1) return true;
return false;
}
int main() {
int Case = 1;
double tt;
char ch1[30], ch2[30];
while (scanf("%d", &n), n) {
for (int i = 1; i <= n; i++) {
scanf("%s", ch1);
M[ch1] = i;
}
scanf("%d", &m);
memset(g, 0, sizeof(g));
for (int i = 0; i < m; i++) {
scanf("%s%lf%s", ch1, &tt, ch2);
g[M[ch1]][M[ch2]] = tt;
}
printf("Case %d: %s\n", Case++, check() ? "Yes" : "No");
}
}