Hrbust 1801 肖申克的救赎【Floyd求最大环】

肖申克的救赎
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 88(35 users)Total Accepted: 21(17 users)Rating: Special Judge: No
Description
    电影《肖申克的救赎》各位都应该非常的熟悉,当安迪杜弗瑞越狱后通过邮局将典狱长诺顿(如图)的黑账本邮寄到警察局。为了确保有足够的证据来逮捕诺顿,警察们需要仔细的对这个账本进行审查,找到诺顿洗钱的确凿证据。当然,钱的源头很难查明了,因为持有账户的人是杜弗瑞虚构出来的一个人物。但是在其它的过程中总是会出现一点蛛丝马迹的,比如诺顿喜欢用这些钱做一些交易,并且使自己最终得到更多的金钱(如果可能的话)。如果诺顿设法通过交易使自己的金钱获得增长,那么警察们就有机会找到诺顿违法的证据,就可以逮捕诺顿了。我们给出一些物品的换算比率,通过这些比率来判是否能找到诺顿违法的确凿证据。
Input

    本题有多组测试数据,一直处理到文件结束。对于每组数据,第一行输入两个整数m和n(n不超过100),分别表示最初金钱的数目(金钱用dollar代指)和兑换的组数。接下来n行输入方式如下:

    物品1 物品2 兑换比率

    表示一个物品1可以兑换多少个物品2,注意兑换比率应该是一个浮点数

Output
    如果警方掌握了确凿的证据,输出“YES”并换行(不包括引号),否则输出“NO”并换行(不包括引号)
Sample Input

100 3

dollar rmb 6.27

rmb gold 0.33

gold dollar 4.01

Sample Output

YES


Hint
要想能做到钱生钱,诺顿必须先有钱
Author
杨和禹

思路:


直接按照汇率建边,将每种货币都看成一个点, 那么接下来求一个最长路,就能够得到最大的汇率,因为最终想要转化成dollar.所以那么对应求的就是一个最大换。

因为点数比较小,所以直接跑Floyd即可。


Ac代码:

#include<stdio.h>
#include<string.h>
#include<map>
#include<iostream>
using namespace std;
double a[150][150];
char b[150];
char c[150];
int main()
{
    int m,n;
    while(~scanf("%d%d",&m,&n))
    {
        memset(a,0,sizeof(a));
        map<string,int >s;
        s["dollar"]=1;
        int cont=2;
        for(int i=0; i<n; i++)
        {
            double w;
            scanf("%s%s%lf",b,c,&w);
            {
                if(s[b]==0)
                {
                    s[b]=cont++;
                }
                if(s[c]==0)
                {
                    s[c]=cont++;
                }
                a[s[b]][s[c]]=w;
            }
        }
        for(int i=0; i<cont; i++)
        {
            for(int j=0; j<cont; j++)
            {
                for(int k=0; k<cont; k++)
                {
                    a[j][k]=max(a[j][k],a[j][i]*a[i][k]);
                }
            }
        }
        if(a[1][1]*m>m)
        {
            printf("YES\n");
        }
        else printf("NO\n");
    }
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值