题目的意思是给出几个国家,并给出每个国家之间的汇率,求这几个国家构成的图中所形成的环中,一个国家的钱转一圈回来之后还可增加,即自身汇率大于1。
用floyd的思路来写,注意一是数组为double型,二是自环初始为1,其他开路的话初始为0。
第一次用map类,将一对string和int关联起来,而且可以用[]运算符操作,很方便。
#include <iostream>
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
using namespace std;
double g[40][40];
double d[40][40];
int main()
{
map<string,int> cur; int t=1;
while(1){
cur.clear();
int n;
cin>>n; if(n==0) break;
memset(g,0,sizeof(g)); memset(d,0,sizeof(d));
for(int i=0;i<n;i++){
string str; cin>>str;
cur[str]=i;
}
int m; cin>>m;
for(int i=0;i<m;i++){
string a,b; double c; cin>>a>>c>>b; //cout<<a<<' '<<b<<' '<<c;
g[ cur[a] ][ cur[b] ]=c;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) d[i][j]=g[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
if( d[j][i]*d[i][k] > d[j][k] ) d[j][k]=d[j][i]*d[i][k];
int b=0;
for(int i=0;i<n;i++){
//cout<<d[i][i]<<' ';
if(d[i][i]>1) b=1;
}
printf("Case %d: ",t++);
if(b) cout<<"Yes\n";
else cout<<"No\n";
char a[5]; gets(a);
}
return 0;
}