类似于Floyd算法的动态规划
#include <iostream>
#include <string.h>
using namespace std;
/*
#include <FSTREAM>
ifstream fin("data.txt");
#define cin fin
*/
int n, m;
char name[31][100];
double g[31][31];
void calc()
{
int i, j, k;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{
for (k=1; k<=n; k++)
{
if (i!=k && j!=k && g[i][k]*g[k][j]>g[i][j])
g[i][j] = g[i][k]*g[k][j];
}
}
for (i=1; i<=n; i++)
{
if (g[i][i] > 1.0)
{
cout << "Yes" << endl;
return;
}
}
cout << "No" << endl;
}
int main()
{
int i, j, k, count=0;
char tmp[100];
double p;
while (cin>>n && n)
{
for (i=1; i<=n; i++)
cin >> name[i];
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
g[i][j] = 0;
cin >> m;
for (i=1; i<=m; i++)
{
cin >> tmp;
for (j=1; j<=n; j++)
{
if (!strcmp(tmp, name[j]))
break;
}
cin >> p;
cin >> tmp;
for (k=1; k<=n; k++)
{
if (!strcmp(tmp, name[k]))
break;
}
g[j][k] = p;
}
cout << "Case " << ++count << ": ";
calc();
}
return 0;
}