比赛 |
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;
- }