spfa。
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int ca;
int n, m;
map<string, int> ma;
struct Node
{
int v, nxt;
double t;
}e[1745];
int h[35], cnt;
double d[35];
bool vis[35];
int cnt2[35];
queue<int> q;
void add(int u, int v, double t)
{
e[cnt].v = v;
e[cnt].t = t;
e[cnt].nxt = h[u];
h[u] = cnt ++;
}
bool spfa(int s)
{
memset(d, 0, sizeof(d));
memset(vis, false, sizeof(vis));
memset(cnt2, 0, sizeof(cnt2));
while(q.size())
q.pop();
q.push(s);
vis[s] = true;
d[s] = 1;
cnt2[s] ++;
int u, v;
while(q.size())
{
u = q.front();
q.pop();
vis[u] = false;
for(int i = h[u]; i != -1; i = e[i].nxt)
{
v = e[i].v;
if(d[v] < d[u] * e[i].t)
{
d[v] = d[u] * e[i].t;
if(vis[v])
continue;
q.push(v);
vis[v] = true;
cnt2[v] ++;
if(cnt2[v] > n)
return true;
}
}
}
return false;
}
int main()
{
while(cin >> n && n)
{
ma.clear();
fill(h, h + 35, -1);
cnt = 0;
ca ++;
string a, b;
double c;
for(int i = 0; i < n; i ++)
{
cin >> a;
ma[a] = i;
}
cin >> m;
for(int i = 0; i < m; i ++)
{
cin >> a >> c >> b;
add(ma[a], ma[b], c);
}
bool flag = true;
for(int i = 0; i < n; i ++)
if(spfa(i))
{
flag = false;
break;
}
if(!flag)
cout << "Case " << ca << ": Yes" << endl;
else
cout << "Case " << ca << ": No" << endl;
}
// system("pause");
return 0;
}