zoukankan      html  css  js  c++  java
  • HDU4274 Spy's Work dfs搜索

    给定一系列树形关系用来描述整个公司的人员关系,现在问给定的这些关系是否存在矛盾的地方。

    比赛的时候写搓了,对于每一个点都去考虑的左右区间,其实这样做是不太好的,因为每次从员工推到boss,其实boss的工资是灵活变动的,也就是说只要boss工资的右区间减去所有孩子的左区间后还要至少留下单位1的工资来满足boss,所以只要计算一个区间关系即可,或者说,右区间是与孩子的右区间没有关系的。

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #define INF (1LL << 40)
    #define MAXN 10000
    using namespace std;
    
    int N, head[MAXN+5], idx;
    
    struct Node {
        long long l, r;
    }e[MAXN+5];
    
    struct Adj {
        int v, next;
    }s[MAXN+5];
    
    void init() {
        idx = -1;
        memset(head, 0xff, sizeof (head));    
    }
    
    void insert(int x, int v) {
        ++idx;
        s[idx].v = v, s[idx].next = head[x];
        head[x] = idx;
    }
    
    bool DFS(int x) {
        long long sum = 0;
        int v;
        for (int i = head[x]; i != -1; i = s[i].next) {
            v = s[i].v;
            if (!DFS(v)) {
                return false;    
            }
            sum += e[v].l;
        }
        e[x].l = max(e[x].l, sum + 1);
        return e[x].l <= e[x].r;
    }
    
    int main()
    {
        int M, a, b, x;
        char op[5];
        bool ans;
        while (scanf("%d", &N) == 1) {
            ans = true;
            init();
            for (int i = 2; i <= N; ++i) {
                scanf("%d", &x);
                insert(x, i);
            }
            for (int i = 1; i <= N; ++i) {
                e[i].l = 1;
                e[i].r = INF;
            }
            scanf("%d", &M);
            for (int i = 0; i < M; ++i) {
                scanf("%d%s%d", &a, op, &b);
                if (op[0] == '=') {
                    e[a].l = max(e[a].l, (long long)b);
                    e[a].r = min(e[a].r, (long long)b); 
                } else if (op[0] == '<') {
                     e[a].r = min(e[a].r, (long long)(b-1));
                } else { 
                     e[a].l = max(e[a].l , (long long)(b+1));
                }
            }
            puts(DFS(1) ? "True" : "Lie");
        }
        return 0;
    }
  • 相关阅读:
    SQL经常使用语法
    【LeetCode】Generate Parentheses 解题报告
    Linux进程间通信(IPC)
    Android菜单menu控件大全
    Android入门常见问题
    c++ struct与class的差别
    hdu 2011 多项式求和
    Android安全机制介绍
    HDOJ 4003 Find Metal Mineral
    HDU 2845 Beans (两次线性dp)
  • 原文地址:https://www.cnblogs.com/Lyush/p/2679405.html
Copyright © 2011-2022 走看看