zoukankan      html  css  js  c++  java
  • HDU 5682 zxa and leaf

    zxa and leaf

    链接

    题意:

      给树上所有点赋一个权值,一条边的权值是两个端点的权值差,使最大的边的权值最小。其中k个叶子节点已经赋值。

    分析:

      二分一个答案mid,然后dp一遍,求每个点的取值范围。

    代码:

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<cctype>
    #include<set>
    #include<queue>
    #include<vector>
    #include<map>
    using namespace std;
    typedef long long LL;
    
    inline int read() {
        int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
        for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
    }
    
    const int N = 100005;
    struct Edge{ int to, nxt; } e[N];
    int head[N], fa[N], L[N], R[N], w[N], En, n;
    
    inline void add_edge(int u,int v) {
        ++En; e[En].to = v, e[En].nxt = head[u]; head[u] = En;
        ++En; e[En].to = u, e[En].nxt = head[v]; head[v] = En;
    }
    void dfs(int u,int x) {
        for (int i = head[u]; i; i = e[i].nxt) {
            int v = e[i].to;
            if (v == fa[u]) continue;
            fa[v] = u;
            dfs(v, x);
            L[u] = max(L[u], L[v] - x);
            R[u] = min(R[u], R[v] + x);
        }
    }
    bool check(int x) {
        for (int i = 1; i <= n; ++i) 
            if (w[i]) L[i] = R[i] = w[i];
            else L[i] = 0, R[i] = 1e9;
        dfs(1, x);
        for (int i = 1; i <= n; ++i) 
            if (L[i] > R[i]) return 0;
        return 1;
    }
    void solve() {
        n = read();int k = read();
        for (int i = 1; i < n; ++i) {
            int u = read(), v = read();
            add_edge(u, v);
        }
        for (int i = 1; i <= k; ++i) w[read()] = read();
        int l = 0, r = 1e9, ans;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (check(mid)) ans = mid, r = mid - 1;
            else l = mid + 1;
        }
        printf("%d
    ", ans);
        En = 0;
        for (int i = 1; i <= n; ++i) head[i] = w[i] = fa[i] = 0;
    }
    int main() {
        for (int T = read(); T --; solve()) ;
        return 0;
    }
  • 相关阅读:
    ffplay 2.5.3 媒体播放器
    MinGW/MSYS 交叉编译环境搭建
    python chm 中文帮助 (2.7 和 3.4)
    wx.html2.WebView在 target="_blank" or rel="external" 没有反映的解决方法
    韩星5,6号 一锅双星技巧
    暖房子工程
    CStringUtf8ToUnicode
    燃气灶中心炉芯帽子生锈了,如何拆不下来?
    翻窗户消失的百岁老人/百岁老人跷家去 中文字幕
    CPinyin unicode汉字查找拼音(支持多音字)
  • 原文地址:https://www.cnblogs.com/mjtcn/p/10346426.html
Copyright © 2011-2022 走看看