Floyed算法1.2

给定一些货币(字符串形式)及汇率(实数),例如a可换x1个b,b可换x2个c,c可换x3个a;

问有没有可能1个a可以换出超过一个a的价值的情况

分析:

1.两者之间相换的汇率给出,a与b汇率x1,b与c汇率x2,那么a与c汇率就是x1*x2;
2.先初始化dis[i][i]为1.0,其它不能互换为0;
3.输入后,更新dis[i][j]的值;
4.利用floyed最短路思想,求出最大值;
5.结果就是dis[i][i]>1.0才符合情况
#include<bits/stdc++.h>
#define INF 0x7fffffffffffffff
#define ll long long
using namespace std;
int n,m;
double dis[1000][1000];
void init()
{
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            dis[i][j]=(i==j?1.0:0);
        }
    }
}
void floyed()
{
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(dis[i][j]<dis[i][k]*dis[k][j]){
                    dis[i][j]=dis[i][k]*dis[k][j];
                }
            }
        }
    }
}
int main()
{
    while(cin>>n&&n!=0){
            map<string,int>mp;
            memset(dis,0,sizeof(dis));
        for(int i=1;i<=n;i++){
            string s;
            cin>>s;
            mp[s]=i;
        }
        init();
        cin>>m;
        for(int i=1;i<=m;i++){
            string a,b;
            double val;
            cin>>a>>val>>b;
            dis[mp[a]][mp[b]]=val;
        }
        floyed();
        int i;
        for(i=1;i<=n;i++){
            if(dis[i][i]>1.0)
                break;
        }
        if(i==n+1)cout<<"no   "<<i<<endl;
        else cout<<"yes  "<<i<<endl;
    }
    return 0;

}

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/83035391