Arbitrage(套利)

poj 2240

题目大意:给出不同的货币,然后是一种对另一种的兑换比率,若从一种货币,经过若干次兑换又换回本身,原来是1元,回来时比一元多,就输出Yes 否则输出No

解决:floyd算法

#include <iostream>

#include <string>



using namespace std;

const int N=35;

double cost[N][N];



int n;

void init()

{

   for(int i=0;i<n;i++)

     for(int j=0;j<n;j++)

     if(i==j)cost[i][j]=1.0;

     else cost[i][j]=0.0;

      

}

void floyd()

{

    int i,j,k;

    for( k=0;k<n;k++)

      for( i=0;i<n;i++)

         for( j=0;j<n;j++)

         if(cost[i][j]<cost[i][k]*cost[k][j])

          cost[i][j]=cost[i][k]*cost[k][j];

    for( i=0;i<n;i++)

     if(cost[i][i]>1){cout<<"Yes"<<endl;return;}

    if(i==n)cout<<"No"<<endl;      

 



}

int main()

{

    int m,i,icase=1;

    string a,b;

    double r;

    while(cin>>n,n)

    {

        init();

        string kind[N];

        for(i=0;i<n;i++)

            cin>>kind[i];

        cin>>m;

        while(m--)

        {

            cin>>a>>r>>b;

            int beg=-1,end=-1;

            for(i=0;i<n && beg==-1 || end==-1;i++)

            {

                if(kind[i]==a)beg=i;

                if(kind[i]==b)end=i;

            }

            cost[beg][end]=r;

        }

        cout<<"Case "<<icase++<<": ";

        floyd();    

    }    

    system("pause");

    return 0;

}

本算法与初始化的时候有很大关系若用一下方法初始化应为

void init()

{

   for(int i=0;i<n;i++)

     for(int j=0;j<n;j++)

      cost[i][j]=-1;

}

void floyd()

{

    int i,j,k;

    for( k=0;k<n;k++)

      for( i=0;i<n;i++)

         for( j=0;j<n;j++)

         //必须判断边存在与否
if(cost[i][k]!=-1 && cost[k][j]!=-1 && cost[i][j]<cost[i][k]*cost[k][j]) cost[i][j]=cost[i][k]*cost[k][j]; for( i=0;i<n;i++) if(cost[i][i]>1){cout<<"Yes"<<endl;return;} if(i==n)cout<<"No"<<endl; }

你可能感兴趣的:(bit)