这题说是什么dp思路下的floyd。。。也就那样吧。。。倒是输入用map对我这类新手还是比较新鲜= =
#include<cstdio>
#include<map>
#include<iostream>
#include<string>
using namespace std;
const int maxn= 30+5;
int n,m;
double d[maxn][maxn];
void init()
{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
d[i][j]=i==j?1.0:0;
}
}
void floyd()
{
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(d[i][j]<d[i][k]*d[k][j]){
d[i][j]=d[i][k]*d[k][j];
}
}
}
}
}
int main()
{
int cas=1;
while(scanf("%d",&n)&&n){
map<string, int > _map;
for(int i=1;i<=n;i++){
string txt;
cin>>txt;
_map[txt]=i;
}
scanf("%d",&m);
init();
for(int i=1;i<=m;i++){
string txt1,txt2;
double val;
cin>>txt1>>val>>txt2;
d[_map[txt1]][_map[txt2]]=val;
//d[_map[txt2]][_map[txt1]]=1/val;
}
floyd();
int flag=0;
for(int i=1;i<=n;i++){
if(d[i][i]>1.0){flag=1;break;}
}
if(flag)cout<<"Case "<<cas<<": Yes\n";
else cout<<"Case "<<cas<<": No\n";
cas++;
}
return 0;
}