zoukankan      html  css  js  c++  java
  • Sum in the tree

    题解

    贪心,从上向下,如果(s[u] = -1),则(a[u]:=)(u)为根的子树中的最小(s)减去(s[pa[u]])。否则,(a[u]:=s[u] - s[pa[u]])

    代码

    void DFS1(int u, int pa) {
        for (auto v : G[u]) if (v != pa) {
            DFS1(v, u);
            Min[u] = min(Min[u], Min[v]);
        }
    }
    
    void DFS2(int u, int pa) {
        for (auto v : G[u]) if (v != pa) {
            if (Min[v] < s[u]) {
                flag = 1;
                return;
            }
            if (s[v] == -1) {
                if (Min[v] == INF32) {
                    a[v] = 0;
                }
                else {
                    a[v] = Min[v] - s[u];
                    s[v] = Min[v];
                }
            }
            else a[v] = s[v] - s[u];
            DFS2(v, u);
        }
    }
    
    int main()
    {
        cin >> n;
        Rep(i, 2, n) {
            int u;
            cin >> u;
    
            G[i].pb(u);
            G[u].pb(i);
        }
        Rep(i, 1, n) {
            cin >> s[i];
            Min[i] = (s[i] == -1 ? INF32 : s[i]);
        }
    
    
        DFS1(1, 0);
    
        if (s[1] == -1) a[1] = Min[1];
        else a[1] = s[1];
    
        DFS2(1, 0);
    
        LL res = 0;
        Rep(i, 1, n) res += a[i];
    
        if (flag) res = -1;
    
        cout << res << endl;
        return 0;
    }
    
  • 相关阅读:
    Hopcroft-Carp 算法模板 自用
    (转)二分图匹配匈牙利算法与KM算法
    LightOJ
    最短路类型 (至今做过的)
    POJ
    POJ
    差分约束
    传递闭包(例题POJ3660)
    arrow,
    分辨率,
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/10244664.html
Copyright © 2011-2022 走看看