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

posted on 2011-08-17 11:19  猿类的进化史  阅读(279)  评论(0编辑  收藏  举报