题目链接:BZOJ - 1907

题目分析

使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点)。

f[x][1] 表示以 x 为根的子树可以与 x 的父亲连接的最小路径数。

转移的方式非常巧妙,Orz PoPoQQQ 的 blog 。

代码

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. const int MaxN = 10000 + 5;
  11.  
  12. int T, n;
  13. int f[MaxN][2];
  14.  
  15. struct Edge
  16. {
  17. int v;
  18. Edge *Next;
  19. } E[MaxN * 2], *P = E, *Point[MaxN];
  20.  
  21. inline void AddEdge(int x, int y)
  22. {
  23. ++P; P -> v = y;
  24. P -> Next = Point[x]; Point[x] = P;
  25. }
  26.  
  27. inline int gmin(int a, int b) {return a < b ? a : b;}
  28.  
  29. void Solve(int x, int Fa)
  30. {
  31. f[x][0] = f[x][1] = 1;
  32. int Temp = 0;
  33. for (Edge *j = Point[x]; j; j = j -> Next)
  34. {
  35. if (j -> v == Fa) continue;
  36. Solve(j -> v, x);
  37. f[x][0] = gmin(f[x][0] + f[j -> v][0], f[x][1] + f[j -> v][1] - 1);
  38. f[x][1] = gmin(f[x][1] + f[j -> v][0], Temp + f[j -> v][1]);
  39. Temp += f[j -> v][0];
  40. }
  41. }
  42.  
  43. int main()
  44. {
  45. scanf("%d", &T);
  46. for (int Case = 1; Case <= T; ++Case)
  47. {
  48. memset(E, 0, sizeof(E)); P = E;
  49. memset(Point, 0, sizeof(Point));
  50. scanf("%d", &n);
  51. int a, b;
  52. for (int i = 1; i <= n - 1; ++i)
  53. {
  54. scanf("%d%d", &a, &b);
  55. AddEdge(a, b);
  56. AddEdge(b, a);
  57. }
  58. Solve(1, 0);
  59. printf("%d\n", f[1][0]);
  60. }
  61. return 0;
  62. }

  

[BZOJ 1907] 树的路径覆盖 【树形DP】的更多相关文章

  1. bzoj 1907: 树的路径覆盖【贪心+树形dp】

    我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...

  2. 【bzoj1907】树的路径覆盖 树形dp

    题目描述 输入 输出 样例输入 1 7 1 2 2 3 2 4 4 6 5 6 6 7 样例输出 3 题解 树形dp 设f[x]表示以x为根的子树完成路径覆盖,且x为某条路径的一端(可以向上延伸)的最 ...

  3. [BZOJ] 1907: 树的路径覆盖

    一个点必然被路径覆盖,根据是否为路径的端点分类 \(f[x][0]\)表示以\(x\)为根的子树,\(x\)不为端点的最小路径覆盖数 \(f[x][1]\)表示以\(x\)为根的子树,\(x\)为一条 ...

  4. 『快乐链覆盖 树形dp』

    快乐链覆盖 Description 给定一棵 n 个点的树,你需要找至多 k 条互不相交的路径,使得它们的长度之和最大 定义两条路径是相交的:当且仅当存在至少一个点,使得这个点在两条路径中都出现 定义 ...

  5. BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)

    BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...

  6. BZOJ1907 树的路径覆盖

    ydc题解上写着贪心,后来又说是树形dp...可惜看不懂(顺便骗三连) 其实就是每个叶子开始拉一条链,从下面一路走上来,遇到能把两条链合起来的就合起来就好了. /******************* ...

  7. BZOJ5123 线段树的匹配(树形dp)

    线段树的任意一棵子树都相当于节点数与该子树相同的线段树.于是假装在树形dp即可,记忆化搜索实现,有效状态数是logn级别的. #include<iostream> #include< ...

  8. BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp

    http://www.lydsy.com/JudgeOnline/problem.php?id=3238 就算是全局变量,也不要忘记,初始化(吐血). 长得一副lca样,没想到是个树形dp(小丫头还有 ...

  9. bzoj 4784: [Zjoi2017]仙人掌【tarjan+树形dp】

    其实挺简单的但是没想出来---- 首先判断无解情况,即,一开始的图就不是仙人掌,使用tarjan判断如果一个点dfs下去有超过一个点比他早,则说明存在非简单环. 然后考虑dp,显然原图中已经属于某个简 ...

随机推荐

  1. Robotium---环境搭建及入门示例

    Robotium是一款基于控件的Android自动化测试框架 环境搭建(window): 安装JDK以及集成Android Sdk的eclipise. 入门: 1,下载Robotium Solo 5. ...

  2. binary heap

    In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...

  3. PureMVC(JS版)源码解析(十):Controller类

          这篇博客我们继续讲解PureMVC的三大核心类(View/Controller/Model)——Controller类.根据PureMVC模块设计,Controller类保存所有的Comm ...

  4. linux 安装软件的地方

    用下边这个命令:mysqladmin -u root -p variables root是你的数据库帐号回车后会提示你输入密码,输入上边填写的帐号对应的密码 回车后出来一个大表,找到datadir这一 ...

  5. jackson 学习笔记

    Jackson以优异的解析性能赢得了好评,今天就看看Jackson的一些简单的用法. Jackson使用之前先要下载,这里一共有三个jar包,想要获得完美的Jackson体验,这三个jar包都不可或缺 ...

  6. ubuntu 12.04 编译安装 nginx

    下载源码包 nginx 地址:http://nginx.org/en/download.html 编译前先安装两个包: 直接编译安装会碰到缺少pcre等问题,这时候只要到再安装两个包就ok sudo ...

  7. PHP-popen()&nbsp;函数打开进程文件指针

    待更新 版权声明:本文为博主原创文章,未经博主允许不得转载.

  8. ThinkPHP的数据库访问的简单操作

    传统的sql与ThinkPHP中的sql相比较   以user表为例 $user=M('user'); 1: SELECT * FROM user----------$user->select( ...

  9. ListView优化分页优化

    缘由 我们在用ListView展现数据的时候.比如展现联系人,如果联系人太多就会出现卡的现象,比如如果有1000多条数据,从数据库里查询,然后装载到List容器这段时间是比较耗时的.虽然我们可以用as ...

  10. struts2-ognl 访问静态方法

    在内网基本上还真没看到有哥们发现这个问题, 在google上有的哥们说 这是 v 2.3.20的一个bug, 有的人说在该版本中已经不建议通过ognl方式访问静态方法了. 对于这两种说法, 我比较赞同 ...