Hdu-1217 Arbitrage

来源:互联网 发布:nginx 读音 编辑:程序博客网 时间:2024/05/17 04:22

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217

题目大意:

给你N种货币,然后给你任意两种货币之间的汇率。如果1单位货币通过多次兑换后大于1单位,则输出Yes,否则No。


解题思路:

1.map简单应用

2.Floyd算法的变形,之后判断dis[i][i],如果大于1,则存在。


代码如下:

#include<iostream>#include<cstdio>#include<map>#include<string>#include<cstring>#include<algorithm>using namespace std;#define N 35int num, road;double dis[N][N]; //找了好久。。。。原来这里错了bool Floyd(){    bool flag;    for(int k = 1; k <= num; ++k) //Floyd        for(int i = 1; i <= num; ++i)             for(int j = 1; j <= num; ++j) //简单变形                if(dis[i][j] < dis[i][k] * dis[k][j])                    dis[i][j] = dis[i][k] * dis[k][j];    flag = false;    for(int i = 1; i <= num; ++i) //有没有回路大于1        if(dis[i][i] > 1)        {            flag = true;            break;        }        return flag;}int main(){    int ncase = 1;    char money[35], b[35], e[35];    double cost;    map<string, int> mp;    while(scanf("%d", &num) && num)    {        mp.clear();        memset(dis, 0, sizeof(dis));        for(int i = 1; i <= num; ++i)        {            scanf("%s", money);            mp[money] = i;        }        scanf("%d", &road);        for(int i = 1; i <= road; ++i)        {            scanf("%s%lf%s", b, &cost, e);            dis[mp[b]][mp[e]] = cost;        }        printf("Case %d: ", ncase++);        if(Floyd()) printf("Yes\n");        else printf("No\n");    }    return 0;}


原创粉丝点击