这道题看见的时候以为只用一次Floyd(统一一个货币的价值为1) 没想到熊哥告诉我可以有交换不出去的货币。。。QAQ
就义无反顾wa了
这么良心的数据 n<=30
不Floyd 跟待何时
不过由于有些货币不连通 不能单独统一一种货币进行Floyd
所以n次Floyd
n^4 由于良心的范围 不会tle
就放心干吧、、
一句话 暴力。。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
double a[40][40],dis[40][40];
struct Money
{
char name[50];
bool operator == (const Money &qwe)const
{
Money x = *this;
int len1 = strlen(x.name) - 1;
int len2 = strlen(qwe.name) - 1;
if(len1 != len2)
return false;
for(int i = 0;i <= len1;i++)
if(x.name[i] != qwe.name[i])
return false;
return true;
}
}money[40],s1,s2;
int n,m,bz,xh;
void readdata()
{
scanf("%d",&n);
if(n==0)
exit(0);
bz=0;
xh++;
memset(a,0,sizeof(a));
for(int i = 1;i <= n;i++)
{
memset(money[i].name,0,sizeof(money[i].name));
scanf("%s",&money[i].name);
}
scanf("%d",&m);
for(int i = 1;i <= m;i++)
{
int u = 0;
int v = 0;
double w = 0;
memset(s1.name,0,sizeof(s1.name));
memset(s2.name,0,sizeof(s2.name));
scanf("%s %lf %s",&s1.name,&w,&s2.name);
for(int j = 1;j <= m;j++)
{
if(money[j] == s1)
u = j;
if(money[j] == s2)
v = j;
if(u * v != 0)
break;
}
a[u][v] = w;
}
}
int main()
{
while(1)
{
readdata();
for(int l = 1;l <= n; l++)
{
memset(dis,0,sizeof(dis));
dis[l][l] = 1;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n ;j++)
dis[i][j] = a[i][j];
for(int k = 1 ;k <= n ;k++)
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
{
if(dis[i][k]*dis[k][j]>dis[i][j])
dis[i][j]=dis[i][k]*dis[k][j];
}
if(dis[l][l]>1)
{
bz=1;
printf("Case %d: Yes\n",xh);
break;
}
}
if(bz==0)
printf("Case %d: No\n",xh);
}
}