套汇。不同的货币有不同的货币转换规则,给出你一些货币的转换比例,问你是否存在套汇现象。
解法:传递闭包用floyd。初始的汇率比例为1,floyd完了之后看有没有大于1的,如果有则存在套汇。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<string>
using namespace std;
double arry[50][50];
int kcase = 0;
int n;
void floyd()
{
for(int k = 0 ; k < n ; k++)
{
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n ; j++)
{
if(arry[i][j] < arry[i][k] * arry[k][j])
{
arry[i][j] = arry[i][k]*arry[k][j];
}
}
}
}
bool flag = false;
for(int i = 0 ; i < n ; i++)
{
if(arry[i][i] > 1.0 )
{
flag = true;
break;
}
}
if(flag)
{
printf("Case %d: Yes\n",++kcase);
}
else
{
printf("Case %d: No\n",++kcase);
}
}
int main()
{
while(scanf("%d",&n) && n)
{
memset(arry,0,sizeof(arry));
map<string,int>List;
string s1,s2;
for(int i = 0 ; i < n ; i++)
{
cin>>s1;
List[s1] = i;
arry[i][i] = 1.0;
}
int m;
scanf("%d",&m);
double f;
for(int i = 0 ; i < m ; i++)
{
cin>>s1>>f>>s2;
int a = List[s1];
int b = List[s2];
arry[a][b] = f;
}
floyd();
}
return 0;
}