1 条题解

  • 0
    @ 2023-12-12 18:41:51
    #include <iostream>
    #include <vector>
    using namespace std;
    const int maxn = 6060;
    int f[maxn][2], h[maxn], p[maxn], n;
    vector<int> g[maxn];
    void dfs(int u, int fa) {   // u是当前节点,fa用于指代u的父节点
        f[u][0] = 0;
        f[u][1] = h[u];
        int sz = g[u].size();
        for (int i = 0; i < sz; i ++) {
            int v = g[u][i];
            if (v == fa) continue;
            dfs(v, u);
            f[u][0] += max(f[v][0], f[v][1]);
            f[u][1] += f[v][0];
        }
    }
    int main() {
        cin >> n;
        for (int i = 1; i <= n; i ++) cin >> h[i];
        for (int i = 1; i < n; i ++) {
            int a, b;
            cin >> a >> b;
            p[a] = b;
            g[b].push_back(a);
        }
        int rt;
        for (int i = 1; i <= n; i ++) {
            if (!p[i]) {
                rt = i;
                break;
            }
        }
        dfs(rt, -1);
        cout << max(f[rt][0], f[rt][1]) << endl;
        return 0;
    }
    
    
    • 1

    信息

    ID
    62
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    2
    上传者