• poj1860 & poj2240(Bellman-Ford)


    1860的思路是将可以换得的不同种的货币的数量当作节点,每个兑换点当成边,然后我抄了个算法导论里面的Bellman-Ford算法,一次就过了。看discussion里面很多讨论精度的,我想都没想过……

    2240是更简单的一个bellman-ford,基本和1860一样,就只多了个map容器的应用而已。

    以下是1860:

    #include <iostream>
    using namespace std;
    
    struct Point{
        int a, b;
        double Rab, Cab, Rba, Cba;
    };
    
    int main()
    {
        int n, m, s;
        double money;
        Point point[101];
        cin >> n >> m >> s >> money;
        for (int i = 0; i < m; i++){
            cin >> point[i].a >> point[i].b
                >> point[i].Rab >> point[i].Cab
                >> point[i].Rba >> point[i].Cba;
        }
        double node[101];
        memset(node, 0, sizeof(node));
        node[s] = money;
        for (int j = 1; j <= n - 1; j++){
            for (int i = 0; i < m; i++){
                if (node[point[i].a] < (node[point[i].b] - point[i].Cba) * point[i].Rba)
                    node[point[i].a] = (node[point[i].b] - point[i].Cba) * point[i].Rba;
                if (node[point[i].b] < (node[point[i].a] - point[i].Cab) * point[i].Rab)
                    node[point[i].b] = (node[point[i].a] - point[i].Cab) * point[i].Rab;
            }
        }
        bool flag = true;
        for (int i = 0; i < m; i++){
            if (node[point[i].a] < (node[point[i].b] - point[i].Cba) * point[i].Rba
                || node[point[i].b] < (node[point[i].a] - point[i].Cab) * point[i].Rab){
                flag = false;
                break;
            }
        }
        cout << (flag ? "NO" : "YES") << endl;
        return 0;
    }

    2240:

    #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    
    struct Edge{
        int type1, type2;
        double rate;
    };
    
    int main()
    {
        int n;
        int testCase = 1;
        while (cin >> n && n != 0){
            double node[31];
            Edge edge[1000];
            map<string, int> currency;
            for (int i = 0; i < n; i++){
                string type;
                cin >> type;
                currency[type] = i;
            }
            int m;
            cin >> m;
            for (int i = 0; i < m; i++){
                string type1, type2;
                double r;
                cin >> type1 >> r >> type2;
                edge[i].type1 = currency[type1];
                edge[i].type2 = currency[type2];
                edge[i].rate = r;
            }
            for (int i = 0; i < n; i++){
                node[i] = 1000000;
            }
            node[0] = 1;
            for (int i = 1; i <= n - 1; i++){
                for (int j = 0; j < m; j++){
                    double tmp = node[edge[j].type1] * edge[j].rate;
                    if (node[edge[j].type2] < tmp){
                        node[edge[j].type2] = tmp;
                    }
                }
            }
            bool flag = false;
            for (int i = 0; i < m; i++){
                if (node[edge[i].type2] < node[edge[i].type1] * edge[i].rate){
                    flag = true;
                    break;
                }
            }
            cout << "Case " << testCase << ": " << (flag ? "Yes" : "No") << endl;
            testCase++;
        }
        return 0;
    }
  • 相关阅读:
    MySql的性能优化
    MySql的备份还原
    MySql的数据目录
    MySql的事务
    MySql的视图
    算法笔记_006:全源最短路径问题【动态规划法】
    算法笔记_005:堆排序问题【变治法】
    算法笔记_004:8枚硬币问题【减治法】
    算法笔记_003:矩阵相乘问题【分治法】
    使用MongoDB和JSP实现一个简单的购物车系统
  • 原文地址:https://www.cnblogs.com/caiminfeng/p/4872124.html
Copyright © 2020-2023  润新知