记录编号 576976 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2008] 骑士 最终得分 100
用户昵称 Gravatarlihaoze 是否通过 通过
代码语言 C++ 运行时间 0.736 s
提交时间 2022-10-19 19:35:31 内存使用 15.29 MiB
显示代码纯文本
#include <bits/stdc++.h>

using i64 = long long;

const int N = 2e6 + 10;
int n, x, y, edge;
i64 f[N][2], a[N];
int e[N], ne[N], h[N], idx;
bool st[N];

void add(int a, int b) {
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++; 
}

void dfs(int u, int last) {
    st[u] = true;
    for (int i = h[u]; i != -1; i = ne[i]) {
        int v = e[i];
        if ((i ^ 1) == last) continue;
        if (!st[v]) 
            dfs(v, i);
        else 
            x = u, y = v, edge = i;
    }
}

void dp(int u, int last) {
    f[u][0] = 0, f[u][1] = a[u];
    for (int i = h[u]; i != -1; i = ne[i]) {
        int v = e[i];
        if ((i ^ 1) == last || i == edge || (i ^ 1) == edge)
            continue;
        dp(v, i);
        f[u][1] += f[v][0];
        f[u][0] += std::max(f[v][1], f[v][0]);
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    freopen("bzoj_1040.in", "r", stdin); 
    freopen("bzoj_1040.out", "w", stdout);
    memset(h, -1, sizeof h);
    std::cin >> n;
    for (int i = 1, t; i <= n; ++ i) {
        std::cin >> a[i] >> t;
        add(t, i), add(i, t);
    }
    i64 ans = 0;
    for (int i = 1; i <= n; ++ i) {
        if (!st[i]) {
            dfs(i, -1);
            dp(x, -1);
            i64 t = f[x][0];
            dp(y, -1);
            ans += std::max(t, f[y][0]);
        }
    }
    std::cout << ans << '\n';
    return 0;
}