floyed算法的變形。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<queue>
#include<map>
#include<string>
using namespace std;
int e,cnt,n,m;
double dis[40][40];
map<string,int> mapp;
int main()
{
int cas=0;
while (~scanf("%d",&n) && n)
{
cnt=0; cas++;
mapp.clear();
memset(dis,0,sizeof(dis));
for (int i=1; i<=n; i++)
{
cnt++;
string str; cin>>str;
mapp[str]=cnt;
dis[i][i]=1;
}
scanf("%d",&m);
for (int i=1; i<=m; i++)
{
string str2,str1; double c;
cin>>str1; cin>>c; cin>>str2;
dis[mapp[str1]][mapp[str2]]=c;
//cout<<"1="<<mapp[str1]<<" 2="<<mapp[str2]<<" c="<<dis[mapp[str1]][mapp[str2]]<<endl;
}
for (int k=1; k<=cnt; k++)
{
for (int i=1; i<=cnt; i++)
{
for (int j=1; j<=cnt; j++)
{
//cout<<"i="<<i<<" k="<<k<<" j="<<j<<endl;
//cout<<"dik="<<dis[i][k]<<" dkj="<<dis[k][j]<<endl;
if (dis[i][j]<dis[i][k]*dis[k][j])
{
dis[i][j]=dis[i][k]*dis[k][j];
}
// cout<<"dij="<<dis[i][j]<<endl;
}
}
}
bool flag=false;
for (int i=1; i<=cnt; i++)
{
if (dis[i][i]>1)
{
flag=true; break;
}
}
if (flag)
cout<<"Case "<<cas<<": Yes"<<endl;
else cout<<"Case "<<cas<<": No"<<endl;
}
return 0;
}