zoukankan      html  css  js  c++  java
  • poj 1062 昂贵的聘礼(floyd path的应用)

    题目链接:http://poj.org/problem?id=1062

    题意就不解释了中问题。

    这题用dfs也行。但是感觉还是floyd比较好一点主要是他们交易是有条件的交易总的等级差不能超过m

    所以这时floyd中path的属性就用到了,path[i][j].MAX表示i交易到j最大等级是多少path[i][j].MIN表示最小等级是多少

    然后接下来就简单了。

    #include <iostream>
    #include <cstring>
    #include <string>
    #include <cmath>
    #define inf 0X3f3f3f3f
    using namespace std;
    int n , m , p , l[110] , x[110] , t[110][110] , v , val[110] , dis[110][110];
    struct TnT {
        int MAX , MIN;
    }path[110][110];
    int Abs(int x , int y) {
        if(x > y)
            return x - y;
        else
            return y - x;
    }
    void floyd() {
        for(int k = 1 ; k <= n ; k++) {
            for(int i = 1 ; i <= n ; i++) {
                for(int j = 1 ; j <= n ; j++) {
                    if(dis[i][j] > dis[i][k] + dis[k][j] && Abs(path[i][k].MAX , path[k][j].MIN) <= m && Abs(path[i][k].MIN , path[k][j].MAX) <= m) {
                        dis[i][j] = dis[i][k] + dis[k][j];
                        path[i][j].MAX = max(path[i][k].MAX , path[k][j].MAX);
                        path[i][j].MIN = min(path[i][k].MIN , path[k][j].MIN);
                    }
                }
            }
        }
    }
    int main() {
        while(cin >> m >> n) {
            for(int i = 1 ; i <= n ; i++) {
                for(int j = 1 ; j <= n ; j++) {
                    path[i][j].MAX = n + 1;
                    path[i][j].MIN = 0;
                    dis[i][j] = inf;
                }
                dis[i][i] = 0;
            }
            for(int i = 1 ; i <= n ; i++) {
                cin >> p >> l[i] >> x[i];
                val[i] = p;
                path[i][i].MAX = l[i];
                path[i][i].MIN = l[i];
                for(int j = 1 ; j <= x[i] ; j++) {
                    cin >> t[i][j] >> v;
                    dis[i][t[i][j]] = v;
                }
            }
            for(int i = 1 ; i <= n ; i++) {
                for(int j = 1 ; j <= x[i] ; j++) {
                    if(Abs(l[i] , l[t[i][j]]) <= m) {
                        path[i][t[i][j]].MAX = max(l[i] , l[t[i][j]]);
                        path[i][t[i][j]].MIN = min(l[i] , l[t[i][j]]);
                    }
                    else {
                        dis[i][t[i][j]] = inf;
                    }
                }
            }
            floyd();
            int MIN = inf;
            for(int i = 1 ; i <= n ; i++) {
                MIN = min(MIN , dis[1][i] + val[i]);
            }
            cout << MIN << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    9.16动手又动脑
    C#中集合的交集:Intersect问题
    LeetCode Easy: 27. Remove Element
    LeetCode Easy: 26.Remove Duplicates from Sorted Array
    LeetCode Easy: 21. Merge Two Sorted Lists
    LeetCode Easy: 20. Valid Parentheses
    LeetCode Easy: 14. Longest Common Prefix
    LeetCode Easy: 13. Roman to Integer
    LeetCode Easy: Palindrome Number
    DL: 初试 tensorflow
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6554598.html
Copyright © 2011-2022 走看看