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++);
    }
}

posted @ 2010-04-28 22:41  北海小龙  阅读(231)  评论(0编辑  收藏  举报