• 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;
    }
    
  • 相关阅读:
    深入理解计算机系统 第七章
    第七周 可执行程序的卸载
    Linux内核设计与实现 第三章
    第六周 进程的描述和进程的创建
    第五周 扒开系统调用的三层皮(下)
    UIWebView和Js交互
    CocoaPods的版本升级
    ios图片添加文字或者水印
    Objective-C 关联
    NSString进行urlencode编码
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6554598.html
Copyright © 2020-2023  润新知