POJ 2240题(Floyd)
//使用Floyd的变形实现
//这就是个套汇的问题,可以用Floyd求最大环,然后判断是不是大于1。
#include <cstdio>
#include <string>
#include <map>
using namespace std;
map<string,int> MAP;
double value[31][31];
double rate;
double tempfloat;
int main()
{
int i,j,k,n,m;
int count=1;
char temp[100],temp1[100];
while(scanf("%d",&n))
{
if(n==0)
break;
MAP.clear(); //清空map
memset(value,0,sizeof(value)); //double类型的二位数组也可用memset进行初始化
for(i=1;i<=n;i++)
{
scanf("%s",temp);
MAP[(string)temp]=i;
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%s %lf %s",temp,&rate,temp1);
value[MAP[(string)temp]][MAP[(string)temp1]]=rate;
}
//此处使用Floyd算法实现
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
tempfloat=value[i][k]*value[k][j];
if(tempfloat>value[i][j]) //此处注意与传统的Floyd算法不同,此处的松弛操作是往大的方向
value[i][j]=tempfloat;
}
for(i=1;i<=n;i++)
if(value[i][i]>1) //判断环
{
printf("Case %d: Yes\n",count++);
break;
}
if(i==n+1)
printf("Case %d: No\n",count++);
}
}