题目大意:
套汇
多实例,输入N然后是N个国家:
输入M然后是M行汇率;
错了多次
一开始对于不存在汇率的国家设为-1但是要判断的条件太多设为0比较好;
汇率不能反向啊
#include <iostream>
#include <cstdio>
#include<cstring>
#include<cmath>
using namespace std;
char s[55][5555];
int n;
double MAP[55][55];
int Find(char str[])
{
for(int i=0; i<n; i++)
if(strcmp(str,s[i])==0)
return i;
}
int main()
{
int m;
int Case=0;
while(scanf("%d",&n)!=EOF&&n!=0)
{
memset(s,0,sizeof(s));
for(int i=0; i<55; i++)
for(int j=0; j<55; j++)
MAP[i][j]=0;
Case++;
for(int i=0; i<n; i++) scanf(" %s",s[i]);
scanf("%d",&m);
for(int i=0; i<m; i++)
{
char str1[5555],str2[5555];
double v;
scanf(" %s %lf %s",str1,&v,str2);
int x=Find(str1);
int y=Find(str2);
MAP[x][y]=v;
MAP[y][x]=1/v;
}
for(int k=0; k<n; k++)
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
if(i!=j&&j!=k&&k!=i)
if(MAP[i][k]*MAP[k][j]>MAP[i][j])
MAP[i][j]=MAP[i][k]*MAP[k][j];
}
int flag=0;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(MAP[i][j]*MAP[j][i]>1)
{
flag=1;
break;
}
}
if(flag) break;
}
if(flag) printf("Case %d: Yes\n",Case);
else printf("Case %d: No\n",Case);
}
return 0;
}