zoukankan      html  css  js  c++  java
  • poj2240

    题意:给定一些货币之间的单向汇率,问一笔钱能否经过若干次对换而增值。

    分析:根据输入建立有向图,不能使用dijaskra,因为增值的方法不一定是优先选择最小的路径,并不是贪心所能解决的。所以要用以动态规划为基本思想的floyd来做。

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    const    int        maxn = 31;
    
    struct edge
    {
        int        x;
        double    l;
        edge(int xx, double ll):x(xx),l(ll)
        {}
    };
    
    string    names[maxn];
    int        n, m;
    double    map[maxn][maxn];
    bool    found;
    
    int getid(string &a)
    {
        int        i;
    
        for (i = 0; i < n; i++)
            if (a == names[i])
                return i;
        return 0;
    }
    
    void init()
    {
        int        i;
        string    name1, name2;
        double    l;
    
        getchar();
        for (i = 0; i < n; i++)
        {
            cin >> names[i];
            map[i][i] = 1;
            getchar();
        }
        scanf("%d", &m);
        getchar();
        for (i = 0; i < m; i++)
        {
            cin >> name1;
            cin >> l;
            cin >> name2;
            map[getid(name1)][getid(name2)]=l;
        }
    }
    
    void floyd()
    {
        int        i, j, k;
    
        found = false;
        for (k = 0; k < n; k++)
            for (i = 0; i < n; i++)
                for (j = 0; j < n; j++)
                    if (map[i][j] < map[i][k] * map[k][j])
                        map[i][j] = map[i][k] * map[k][j];
        for (i = 0; i < n; i++)
            if (map[i][i] > 1)
            {
                found = true;
                break;
            }
    }
    
    int main()
    {
        int        t = 0;
    
        //freopen("t.txt", "r", stdin);
        while (cin >> n && n != 0)
        {
            init();
            found = false;
            printf("Case %d: ", ++t);
            floyd();
            if (found)
                printf("Yes\n");
            else
                printf("No\n");
        }
        return 0;
    }
  • 相关阅读:
    9.3 simulated match
    网络流模版大全
    Treblecross
    ENimEN
    求逆序对的两种方法(树状数组/归并排序)
    树状数组
    计算最短路和次短路条数
    Python3.7版库的安装以及常用方法(十分简单)
    二维线段树(hdu1823)
    流星雨(记忆化搜索)
  • 原文地址:https://www.cnblogs.com/rainydays/p/1948666.html
Copyright © 2011-2022 走看看