比赛 |
EYOI与SBOI开学欢乐赛11th |
评测结果 |
AEAEAAAAAE |
题目名称 |
骑士 |
最终得分 |
70 |
用户昵称 |
lihaoze |
运行时间 |
2.873 s |
代码语言 |
C++ |
内存使用 |
26.48 MiB |
提交时间 |
2022-10-14 21:05:19 |
显示代码纯文本
#include <bits/stdc++.h>
using i64 = long long;
const int N = 1e6+10;
i64 n, x, y, eg;
i64 a[N];
i64 f[N][2];
i64 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]) {
if ((i ^ 1) == last) continue;
if (st[e[i]])
x = u, y = e[i], eg = i;
else
dfs(e[i], i);
}
}
void dp(int u, int last) {
f[u][1] = a[u], f[u][0] = 0;
for (int i = h[u]; i != -1; i = ne[i]) {
if (i == eg || (i ^ 1) == last || (i ^ 1) == eg) continue;
int v = e[i];
dp(v, i);
f[u][0] += std::max(f[v][0], f[v][1]);
f[u][1] += f[v][0];
}
}
int main() {
freopen("bzoj_1040.in", "r", stdin);
freopen("bzoj_1040.out", "w", stdout);
memset(h, -1, sizeof h);
std::cin >> n;
for (int v = 1, u; v <= n; ++ v)
std::cin >> a[v] >> u,
add(u, v), add(v, u);
i64 ans = 0;
for (int i = 1; i <= n; ++ i)
if (!st[i]) {
dfs(i, 0);
dp(x, 0);
i64 nw = f[x][0];
dp(y, 0);
ans += std::max(nw, f[y][0]);
}
std::cout << ans << '\n';
return 0;
}