zoukankan      html  css  js  c++  java
  • HDU 4274 Spy's Work (树 DFS)

    给定N个点,每个点都有一个唯一的前驱结点(点1为大boss),每个点的实际权值是子节点的求和值。现在给出某些点的权值的估算(> , = , < ),问这些估算是否会有冲突,现在保证每个点的权值是大于等于1的。

    分析: 判断标准为每个点的上下界,初始化为INF和1,每个点上下界可以根据给出的信息,或者搜索出的信息进行更新,如果出现上界小于下界的情况就说明矛盾了。

    计算过程中数据量竟然没有超过int................

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    # define INF 0x7FFFFFFF
    using namespace std;
    int n,m,flag;
    struct Guess {
        int high,low;
        char c;
    } guess[10001];
    
    struct node {
        int s,e,next;
    } ed[10001];
    int head[10001],num;
    void init() {
        memset(head,-1,sizeof(head));
        num = 0;
        flag = 1;
        for(int i=0; i<=n; i++) {
            guess[i].low = 1;
            guess[i].high = INF;
        }
    }
    void add(int s,int e) {
        ed[num].s = s;
        ed[num].e = e;
        ed[num].next = head[s];
        head[s] = num++;
    }
    
    void cmp(int i,int h,int l) {
        int hh = min(guess[i].high ,h);
        int ll = max(guess[i].low,l);
        if(hh < ll) flag = 0;
        guess[i].high = hh;
        guess[i].low = ll;
    }
    
    void dfs(int v0) {
        if(flag == 0) return ;
        int h = INF,l = 1;
        for(int i=head[v0]; i != -1; i= ed[i].next) {
            int e = ed[i].e;
            dfs(e);
            l += guess[e].low;
        }
        cmp(v0,h,l);
    }
    int main() {
        int t,a,b;
        char c;
        while(scanf("%d",&n) != EOF) {
            init();
            for(int i=2; i<=n; i++) {
                scanf("%d",&t);
                add(t,i);
            }
            scanf("%d",&m);
            int h,l;
            for(int i=0; i<m; i++) {
                scanf("%d %c %d",&a,&c,&b);
                h = INF;
                l = 1;
                if(c == '=') {
                    l = b; h = b;
                }
                if(c == '<') h = b - 1;
                if(c == '>') l = b + 1;
                cmp(a,h,l);
            }
            dfs(1);
            if(flag) printf("True
    ");
            else printf("Lie
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    3种方式提高页面加载速度
    CSS中的层叠、特殊性、继承、样式表中的@import
    jQuery从零开始(二)
    jQuery从零开始(一)
    设计模式
    Vue-cli3脚手架工具快速创建一个项目
    Git上传到码云及其常见问题详解
    eclipse导入本地的svn项目后不能在team提交更新
    js拖拽上传图片
    axure 动态面板制作图片轮播 (01图片轮播)
  • 原文地址:https://www.cnblogs.com/riskyer/p/3239122.html
Copyright © 2011-2022 走看看