题目:

1040: [ZJOI2008]骑士

解析:

假设骑士\(u\)讨厌骑士\(v\),我们在\(u\),\(v\)之间连一条边,这样我们就得到了一个奇环树(奇环森林),既然是一颗奇环树,我们就先考虑把环断开,设断开边边连接的两点是\(rt1\),\(rt2\),断环的话直接标记这条边不能经过就好了

根据题意,我们要求的是相邻两个节点不能同时选时的最大价值,这不就是奇环树版的没有上司的舞会吗。

那么很容易的得到转移方程

设\(f[u][1/0]\)表示以\(u\)为根,选/不选可以得到的最大价值

\[\begin{cases}
f[u][1] += f[v][0]\\\\
f[u][0] += max(f[v][0], f[v][1])
\end{cases}\]

然后分别以\(rt1\),\(rt2\)为根做树形DP

因为\(rt1\)和\(rt2\)分别是环上的两点,两点不可以同时选,我们分别强制\(rt1\),\(rt2\)不选,累加最大值

原图可能是奇环森林,所以用vis标记一下每个点是否被访问过

代码:

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N = 2e6 + 10;
  5. int n, m, num = 1, rt1, rt2, flag, ans, kk;
  6. int head[N], f[N][2], a[N];
  7. bool vis[N], vis2[N];
  8. struct node {
  9. int v, nx;
  10. } e[N];
  11. template<class T>inline void read(T &x) {
  12. x = 0; int f = 0; char ch = getchar();
  13. while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
  14. while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  15. x = f ? -x : x;
  16. return;
  17. }
  18. inline void add(int u, int v) {
  19. e[++num] = (node) {v, head[u]}, head[u] = num;
  20. }
  21. void FindCircle(int u, int fa) {
  22. vis[u] = 1;
  23. for (int i = head[u]; ~i; i = e[i].nx) {
  24. int v = e[i].v;
  25. if (v == fa) continue;
  26. if (!vis[v]) FindCircle(v, u);
  27. else {
  28. rt1 = u, rt2 = v;
  29. kk = i;
  30. }
  31. }
  32. }
  33. void dfs(int u, int fa) {
  34. f[u][1] = a[u];
  35. for (int i = head[u]; ~i; i = e[i].nx) {
  36. int v = e[i].v;
  37. if (v == fa || i == kk || (i ^ 1) == kk) continue;
  38. dfs(v, u);
  39. f[u][1] += f[v][0];
  40. f[u][0] += max(f[v][1], f[v][0]);
  41. }
  42. }
  43. signed main() {
  44. memset(head, -1, sizeof head);
  45. read(n);
  46. for (int i = 1, x; i <= n; ++i) {
  47. read(a[i]), read(x);
  48. add(i, x), add(x, i);
  49. }
  50. for (int i = 1; i <= n; ++i) {
  51. if (vis[i]) continue;
  52. int tmp = 0;
  53. FindCircle(i, -1);
  54. memset(f, 0, sizeof f);
  55. dfs(rt1, -1);
  56. tmp = max(tmp, f[rt1][0]);
  57. memset(f, 0, sizeof f);
  58. dfs(rt2, -1);
  59. tmp = max(tmp, f[rt2][0]);
  60. ans += tmp;
  61. }
  62. cout << ans << endl;
  63. }

BZOJ1040: [ZJOI2008]骑士(奇环树,DP)的更多相关文章

  1. 【BZOJ】1040: [ZJOI2008]骑士(环套树dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1040 简直不能再神的题orz. 蒟蒻即使蒟蒻,完全不会. 一开始看到数据n<=1000000就 ...

  2. BZOJ 1040: [ZJOI2008]骑士(基环树dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题意: 思路: 这是基环树,因为每个人只会有一个厌恶的人,所以每个节点只会有一个父亲节点,但是 ...

  3. [bzoj1040][ZJOI2007]骑士(环套树DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1040 分析:第一感觉肯定是树形DP,但可惜不是树.仔细分析,这个图很特殊,每个联通块肯 ...

  4. 1040: [ZJOI2008]骑士~基环外向树dp

    Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...

  5. [BZOJ1040][ZJOI2008]骑士(环套树dp)

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5816  Solved: 2263[Submit][Status ...

  6. 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士

    基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...

  7. [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集

    骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...

  8. [ZJOI2008]骑士(基环树,树形dp)

    [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...

  9. BZOJ1040 [ZJOI2008]骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...

随机推荐

  1. Nginx对图片进行防盗链

    这里需要使用两台Linux主机(一台充当防盗链服务器,一台充当盗链服务器),下表是它们所使用的操作系统以及IP地址. 两台Linux主机所使用的操作系统以及IP地址 主机名称 操作系统 IP地址 防盗 ...

  2. Linux——清除服务器的日志文件

    前言 无论多大的磁盘都遭不住日志文件的糟蹋啊,所以还是需要定时的清除一下. 命令 查找所有.log结尾的文件删除 find / -name "*.log" -exec rm -rv ...

  3. Kafka数据安全性、运行原理、存储

    直接贴面试题: 怎么保证数据 kafka 里的数据安全? 答: 生产者数据的不丢失kafka 的 ack 机制: 在 kafka 发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够 ...

  4. MVC Core 使用TagHelper扩展几个插件

    未完待续... 案例1:按钮权限校验,无权限不显示,利用TagHelper控制元素是否输出 [HtmlTargetElement("tc-permission", TagStruc ...

  5. LeetCode 1213. Intersection of Three Sorted Arrays

    原题链接在这里:https://leetcode.com/problems/intersection-of-three-sorted-arrays/ 题目: Given three integer a ...

  6. sass、less异同

    相同点: 1.混入(Mixins):class中的class 2.参数混入:可以传递参数的class,就像函数一样 3.嵌套规则:class中嵌套class,从而减少重复的代码 4.运算:css中用上 ...

  7. python总结六

    1.python中主要存在四种命名方式: object #公用方法 _object #半保护                  #被看作是“protect”,意思是只有类对象和子类对象自己能访问到这些 ...

  8. Java高级开发_性能优化的细节

    一.核心部分总结: 尽量在合适的场合使用单例[减负提高效率] 尽量避免随意使用静态变量[GC] 尽量重用对象,避免过多过常地创建Java对象[最大限度地重用对象] 尽量使用final修饰符[内联(in ...

  9. Spring Security教程之加点密,加点盐(七)

    一.概述 一般用数据库保存用户的密码都是经过加密,甚少使用明文.同时,加密方式一般采用不可逆的加密方法,如MD5.也要避免相同的密码在加密后有相同的密文,如admin用户的密码为admin,加密后变成 ...

  10. 2018-2019-20175205实验四《Android程序设计》实验报告

    目录 2018-2019-20175205实验四<Android程序设计>实验报告 实验要求 教材学习 第二十五章 活动 第二十六章 UI组件 第二十七章 布局 实验步骤 任务一 任务二 ...