//太郁闷了!自己货币换自己货币居然还存在不等于1的情况,只能说:他妹!
//另外学到了Floyd求环的办法:初始一个特殊的值,如果D[i][i]有发生改变,就存在环(之前看过但没用过 呵呵)
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
char Money[30][100],tMoney[100];
double D[30][30];
int main()
{
int i,j,x1,x2;
double rate;
int sum=1;
while(cin>>n,n>0)
{
for(i=0;i<n;i++)
scanf("%s",Money[i]);
cin>>m;
//初始化D
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
D[i][j]=-1;
}
for(i=0;i<n;i++)//自己换自己是1换1
D[i][i]=1;
for(i=0;i<m;i++)
{
scanf("%s",tMoney);
for(j=0;j<n;j++)
{
if(!strcmp(Money[j],tMoney))//找到对应货币的ID
{
x1=j;
break;
}
}
cin>>rate;
scanf("%s",tMoney);
for(j=0;j<n;j++)
{
if(!strcmp(Money[j],tMoney))
{
x2=j;
break;
}
}
D[x1][x2]=rate;
}
//Floyd
int k;
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(D[i][k]>0 && D[k][j]>0 && D[i][k]*D[k][j]>D[i][j])
D[i][j]=D[i][k]*D[k][j];
}
}
}
//判断是否存在货币自己换自己大于1了
for(i=0;i<n;i++)
if(D[i][i]>1)
{
printf("Case %d: Yes\n",sum++);
break;
}
if(i==n) printf("Case %d: No\n",sum++);
}
return 0;
}
Floyd求环_Poj_2240
最新推荐文章于 2018-11-18 19:58:33 发布