比赛 EYOI与SBOI开学欢乐赛11th 评测结果 AEAEAAAAAE
题目名称 骑士 最终得分 70
用户昵称 lihaoze 运行时间 2.873 s
代码语言 C++ 内存使用 26.48 MiB
提交时间 2022-10-14 21:05:19
显示代码纯文本
  1. #include <bits/stdc++.h>
  2.  
  3. using i64 = long long;
  4.  
  5. const int N = 1e6+10;
  6. i64 n, x, y, eg;
  7. i64 a[N];
  8. i64 f[N][2];
  9. i64 e[N], ne[N], h[N], idx;
  10. bool st[N];
  11.  
  12. void add(int a, int b) {
  13. e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
  14. }
  15.  
  16. void dfs(int u, int last) {
  17. st[u] = true;
  18. for (int i = h[u]; i != -1; i = ne[i]) {
  19. if ((i ^ 1) == last) continue;
  20. if (st[e[i]])
  21. x = u, y = e[i], eg = i;
  22. else
  23. dfs(e[i], i);
  24. }
  25. }
  26.  
  27. void dp(int u, int last) {
  28. f[u][1] = a[u], f[u][0] = 0;
  29. for (int i = h[u]; i != -1; i = ne[i]) {
  30. if (i == eg || (i ^ 1) == last || (i ^ 1) == eg) continue;
  31. int v = e[i];
  32. dp(v, i);
  33. f[u][0] += std::max(f[v][0], f[v][1]);
  34. f[u][1] += f[v][0];
  35. }
  36. }
  37.  
  38. int main() {
  39. freopen("bzoj_1040.in", "r", stdin);
  40. freopen("bzoj_1040.out", "w", stdout);
  41. memset(h, -1, sizeof h);
  42. std::cin >> n;
  43. for (int v = 1, u; v <= n; ++ v)
  44. std::cin >> a[v] >> u,
  45. add(u, v), add(v, u);
  46. i64 ans = 0;
  47. for (int i = 1; i <= n; ++ i)
  48. if (!st[i]) {
  49. dfs(i, 0);
  50. dp(x, 0);
  51. i64 nw = f[x][0];
  52. dp(y, 0);
  53. ans += std::max(nw, f[y][0]);
  54. }
  55. std::cout << ans << '\n';
  56. return 0;
  57. }