题意:有n个国家,每两个国家之间都有一定的汇率,问怎么样转换才能赚钱。
以国家为顶点,汇率为边长,构造一个图,如果从自身出发回到自身的路径乘积和大于1,则说明可以赚钱。
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;
char ch[40],sh[40];
double dis[55][55];
void Floyd(int n)
{
int i,j,k;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(dis[i][j]<dis[i][k]*dis[k][j])
dis[i][j]=dis[i][k]*dis[k][j];
}
}
}
}
int main()
{
int n,i,m,flag,cas=0;
double w;
map<string,int>mp;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
mp.clear();
for(i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
dis[i][j]=0;
}
for(i=1;i<=n;i++)
{
scanf("%s",ch);
mp[ch]=i;
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%s%lf%s",ch,&w,sh);
dis[mp[ch]][mp[sh]]=w;
}
Floyd(n);
flag=0;
for(i=1;i<=n;i++)
{
if(dis[i][i]>1)
{
flag=1;break;
}
}
if(flag) printf("Case %d: Yes\n",++cas);
else printf("Case %d: No\n",++cas);
}
return 0;
}