1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define fi first
  4. #define se second
  5. #define mk make_pair
  6. #define pii pair<int, int>
  7. #define y1 skldjfskldjg
  8. #define y2 skldfjsklejg
  9.  
  10. using namespace std;
  11.  
  12. const int N = 1e6 + ;
  13. const int M = 1e5 + ;
  14. const int inf = 0x3f3f3f3f;
  15. const LL INF = 0x3f3f3f3f3f3f3f3f;
  16. const int mod = 1e9 +;
  17.  
  18. int n, tot, a[N], fa[N], b[N], head[N];
  19. bool vis[N];
  20. LL f[N][];
  21.  
  22. struct Edge {
  23. int to, nx;
  24. } edge[N << ];
  25.  
  26. void add(int u, int v) {
  27. edge[tot].to = v;
  28. edge[tot].nx = head[u];
  29. head[u] = tot++;
  30. }
  31.  
  32. int getRoot(int x) {
  33. return fa[x] == x ? x : fa[x] = getRoot(fa[x]);
  34. }
  35.  
  36. void dp(int u, int fa, int ban) {
  37. f[u][] = , f[u][] = a[u];
  38. LL tmp[] = {};
  39.  
  40. for(int i = head[u]; ~i; i = edge[i].nx) {
  41. int v = edge[i].to;
  42. if(v == fa || i == ban || (i ^ ) == ban) continue;
  43. dp(v, u, ban);
  44.  
  45. tmp[] = f[u][], tmp[] = f[u][];
  46.  
  47. tmp[] = max(tmp[], f[u][] + f[v][]);
  48. tmp[] = max(tmp[], f[u][] + f[v][]);
  49. tmp[] = max(tmp[], f[u][] + f[v][]);
  50.  
  51. f[u][] = tmp[], f[u][] = tmp[];
  52. }
  53. }
  54.  
  55. int main() {
  56. memset(head, -, sizeof(head));
  57.  
  58. scanf("%d", &n);
  59. for(int i = ; i <= n; i++) {
  60. scanf("%d%d", &a[i], &b[i]);
  61. add(i, b[i]); add(b[i], i);
  62. fa[i] = i;
  63. }
  64.  
  65. LL ans = ;
  66. for(int i = ; i <= n; i++) {
  67. int x = getRoot(i);
  68. int y = getRoot(b[i]);
  69. if(x != y) {
  70. fa[x] = y;
  71. } else {
  72. LL ret = ;
  73. dp(i, , i * - );
  74. ret = max(ret, f[i][]);
  75. dp(b[i], , i * - );
  76. ret = max(ret, f[b[i]][]);
  77. ans += ret;
  78. }
  79. }
  80.  
  81. printf("%lld\n", ans);
  82. return ;
  83. }
  84.  
  85. /*
  86. */

bzoj 1040 基向内环树dp的更多相关文章

  1. BZOJ 1040 骑士(环套树DP)

    如果m=n-1,显然这就是一个经典的树形dp. 现在是m=n,这是一个环套树森林,破掉这个环后,就成了一个树,那么这条破开的边连接的两个顶点不能同时选择.我们可以对这两个点进行两次树形DP根不选的情况 ...

  2. bzoj 3572世界树 虚树+dp

    题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...

  3. BZOJ 1040 骑士 基环树 树形DP

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1040 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫 ...

  4. bzoj 1040: [ZJOI2008]骑士 树形dp

    题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3054  Solved: 1162[Submit][S ...

  5. [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】

    题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...

  6. 【BZOJ】1040: [ZJOI2008]骑士 环套树DP

    [题意]给定n个人的ai和bi,表示第i个人能力值为ai且不能和bi同时选择,求能力值和最大的选择方案.n<=10^6. [算法]环套树DP(基环树) [题解]n个点n条边——基环森林(若干环套 ...

  7. 【BZOJ 1124】[POI2008] 枪战Maf Tarjan+树dp

    #define int long long using namespace std; signed main(){ 这个题一看就是图论题,然后我们观察他的性质,因为一个图论题如果没有什么性质,就是真· ...

  8. BZOJ 3572 [HNOI2014]世界树 (虚树+DP)

    题面:BZOJ传送门 洛谷传送门 题目大意:略 细节贼多的虚树$DP$ 先考虑只有一次询问的情况 一个节点$x$可能被它子树内的一个到x距离最小的特殊点管辖,还可能被管辖fa[x]的特殊点管辖 跑两次 ...

  9. bzoj 2286 [Sdoi2011]消耗战 虚树+dp

    题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn( ...

随机推荐

  1. hibernate、mybatis、beetsql的学习

    先推荐两篇文章吧: https://my.oschina.net/xiandafu/blog/617542 http://blog.csdn.net/xiandafu/article/details/ ...

  2. echarts.js中的图表大小自适应

    echarts的图表,如果父级容器的height/width属性设置为百分比的形式,那么echarts就会warning,且不能正常的生成图表.所以div容器的高度宽度必须指定为px,这设计不知道是为 ...

  3. react+propTypes

    React.createClass({ propTypes: { // 可以声明 prop 为指定的 JS 基本数据类型,默认情况,这些数据是可选的 optionalArray: React.Prop ...

  4. HDU 2154 跳舞毯 | DP | 递推 | 规律

    Description 由于长期缺乏运动,小黑发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥. 小黑买来一块圆形的毯子,把它们分成三等分,分别标上A,B,C,称之为“跳舞毯”,他的运动方式是 ...

  5. shell 25个常用命令

    1.列出所有目录使用量,并按大小排序.   ls|xargs du -h|sort -rn #不递归下级目录使用du -sh 2.查看文件排除以#开关和空白行,适合查看配置文件.   egrep -v ...

  6. Vuejs - 组件式开发

    初识组件 组件(Component)绝对是 Vue 最强大的功能之一.它可以扩展HTML元素,封装可复用代码.从较高层面讲,可以理解组件为自定义的HTML元素,Vue 的编译器为它添加了特殊强大的功能 ...

  7. js_在原有的日期上添加天数输出添加后的日期

    开始编码工作也有段时间了,想想没有留下点什么,有点遗憾.学到的一些经验,写写,分享一下.也给自己整理一下. 今天分享一下,在原有的日期上添加天数输出添加后的日期.开始做的时候,简单的思路是,直接用ne ...

  8. 在使用ubuntu16.04+python3.5 下使用pip3出现pip3 error - '_NamespacePath' object has no attribute 'sort'

    使用pip3安装tensorflow以及gensim等时,出现如下错误: Traceback (most recent call last): File "/usr/local/bin/pi ...

  9. feign hystrix 线程池伸缩控制

    当前使用的版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...

  10. 2017-2018-1 20179205《Linux内核原理与设计》第十周作业

    <Linux内核原理与设计>第十周作业 教材17.19.20章学习及收获 1.在Linux以及所有unix系统中,设备被分为以下三种:块设备(blkdev)以块为单位寻址,通过块设备节点来 ...