算法思想:从i到j的只经过 前k个 点的最短路径
#include<bits/stdc++.h>
using namespace std;
int n,m;
map<string ,int> mp;
double g[35][35];
int main(){
string a,b;
int cas=0;
double x;
while(cin>>n,n!=0){
for(int i=1;i<=n;i++){
cin>>a;
mp[a]=i;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
g[i][j]=(i==j)?1:0;
}
cin>>m;
while(m--){
cin>>a>>x>>b;
g[mp[a]][mp[b]]=x;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
g[i][j]=max(g[i][j],g[i][k]*g[k][j]);
}
printf("Case %d: ",++cas);
int f=0;
for(int i=1;i<=n;i++)
if(g[i][i]>1){
f=1;break;
}
if(f) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}