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

来源:互联网 发布:黑马程序员 课程表 编辑:程序博客网 时间:2024/04/30 19:13

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