poj 2240 Arbitrage (floyd 变形)

http://poj.org/problem?id=2240

floyd 的变形   题意 有n个货币,他们的交换情况m个
例如:
3
USDollar
BritishPound
FrenchFranc
3
USDollar 0.5 BritishPound
BritishPound 10.0 FrenchFranc
FrenchFranc 0.21 USDollar

求出 是否存个一个增长的货币回路

#include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
const double eps=1e-8;
#define max 999999
const int N=1000;
using namespace std;
int n,m;
double dis[N],map[N][N];
int vis[N];
string name[N];
int search(string a)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(name[i]==a)return i;
    }
}
void floyd()
{
    int i,j,k;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            for(k=0;k<n;k++)
            {
                double t=map[j][i]*map[i][k];
                if(map[j][k]<t)map[j][k]=t;
            }
        }
    }
}
int main()
{
    int l=0,i;
    while(cin>>n)
    {
        if(n==0)break;
        l++;
        for(i=0;i<n;i++)
        {
            cin>>name[i];
        }
        cin>>m;
        string a,b;
        memset(map,0,sizeof(map));
        double w;
        while(m--)
        {
            cin>>a>>w>>b;
            int x=search(a);
            int y=search(b);
            map[x][y]=w;
        }
        floyd();
        int ans=0;
        for(i=0;i<n;i++)
        {
            if(map[i][i]>1.0){ans=1;break;}
        }
        if(ans)printf("Case %d: Yes\n",l);
        else printf("Case %d: No\n",l);
    }


}

  

posted @ 2012-03-03 15:21  Szz  阅读(144)  评论(0编辑  收藏  举报