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

    }





}

  

你可能感兴趣的:(floyd)