#493. 求树的最小支配集

问题描述

对于一棵n个结点的无根树,求它的最小支配集。 最小支配集:指从所有顶点中取尽量少的点组成一个集合,使得剩下的所有点都与取出来的点有边相连。顶点个数最小的支配集被称为最小支配集。

输入格式

第一行一个整数n,表示结点数。接下来n-1行,每行两个整数a,b,表示结点a和b有边。

输出格式

一行,一个整数,表示最小支配集中元素的个数。

输入样例

  1. 9
  2. 2 5
  3. 2 7
  4. 2 8
  5. 9 2
  6. 3 2
  7. 3 1
  8. 3 6
  9. 4 3

输出样例

  1. 2

限制与预定

1 < n <=100000

时间限制:1s

空间限制:128mb

  1. #include<cstdio>
  2. using namespace std;
  3. const int maxn=1e5+;
  4. int n,f[maxn][];
  5. //0->儿子,1->父亲,2->自己
  6. inline int min(int a,int b){
  7. return(a<b?a:b);
  8. }
  9. inline void read(int &ans){
  10. ans=;int b=;
  11. char x=getchar();
  12. while(x<'' || ''<x){
  13. if(x=='-')b=-;
  14. x=getchar();
  15. }
  16. while(''<=x && x<=''){
  17. ans=(ans<<)+(ans<<)+x-'';
  18. x=getchar();
  19. }
  20. ans*=b;
  21. }
  22. int edge_count=,to[maxn*],next[maxn*],first[maxn];
  23. inline void add_edge(int x,int y){
  24. edge_count++;
  25. to[edge_count]=y;
  26. next[edge_count]=first[x];
  27. first[x]=edge_count;
  28. }
  29. void search(int root,int fa)
  30. {
  31. int pos=;
  32. for(int i=first[root];i;i=next[i]){
  33. if(to[i]==fa)continue;
  34.  
  35. search(to[i],root);
  36. f[root][]+=f[ to[i] ][];
  37. f[root][]+=min(f[ to[i] ][],f[ to[i] ][]);//+最小值
  38.  
  39. if( f[ to[i] ][]-f[ to[i] ][] < f[pos][]-f[pos][] )
  40. pos=to[i];
  41. }
  42. f[root][]++;
  43. if(f[root][]>f[root][])f[root][]=f[root][];
  44. bool fd=;
  45. for( int i=first[root];i;i=next[i] ){
  46. if(to[i]==fa)continue;
  47. fd=;
  48. if(to[i]==pos){
  49. f[root][]+=f[pos][];
  50. }
  51. else{
  52. f[root][]+=min(f[to[i]][],f[to[i]][]);
  53. }
  54. }
  55. f[root][]+=fd;
  56. //if(root==9||root==8||root==7||root==5)printf("%d %d",root,f[root][0]);
  57. //if(f[root][0]||f[root][1]||f[root][2] )printf("%d",root);
  58. //if(root==1)printf("%d",f[1][0]);
  59. }
  60. int main()
  61. {
  62. //freopen("2.in","r",stdin);
  63.  
  64. read(n);
  65. for( int i=,a,b;i<n;i++){
  66. read(a);read(b);
  67. add_edge(a,b);
  68. add_edge(b,a);
  69. }
  70. f[][]=0x7fffffff;
  71. search(,);
  72. printf("%d",min(f[][],min(f[][]+,f[][])));
  73. return ;
  74. }

树dp:边覆盖,点覆盖的更多相关文章

  1. CF456D A Lot of Games (字典树+DP)

    D - A Lot of Games CF#260 Div2 D题 CF#260 Div1 B题 Codeforces Round #260 CF455B D. A Lot of Games time ...

  2. HDU4916 Count on the path(树dp??)

    这道题的题意其实有点略晦涩,定义f(a,b)为 minimum of vertices not on the path between vertices a and b. 其实它加一个minimum ...

  3. Codeforces 219D. Choosing Capital for Treeland (树dp)

    题目链接:http://codeforces.com/contest/219/problem/D 树dp //#pragma comment(linker, "/STACK:10240000 ...

  4. HDU4276 The Ghost Blows Light SPFA&&树dp

    题目的介绍以及思路完全参考了下面的博客:http://blog.csdn.net/acm_cxlove/article/details/7964739 做这道题主要是为了加强自己对SPFA的代码的训练 ...

  5. Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)

    [题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...

  6. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  7. bzoj 3572世界树 虚树+dp

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

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

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

  9. (纪念第一道完全自己想的树DP)CodeForces 219D Choosing Capital for Treeland

    Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes inpu ...

  10. 51nod1812树的双直径(换根树DP)

    传送门:http://www.51nod.com/Challenge/Problem.html#!#problemId=1812 题解:头一次写换根树DP. 求两条不相交的直径乘积最大,所以可以这样考 ...

随机推荐

  1. Nginx 处理Http请求简单流程

    L45 1:三次握手后 系统内核收到请求根据端口负载均衡的分配到某个worker 2:nginx 会分配一个512byte链接内存池 3:初始化nginx的http模块并等待用户请求,假设用户在cli ...

  2. [BZOJ 4818] [SDOI 2017] 序列计数

    Description Alice想要得到一个长度为 \(n\) 的序列,序列中的数都是不超过 \(m\) 的正整数,而且这 \(n\) 个数的和是 \(p\) 的倍数. Alice还希望,这 \(n ...

  3. windows下零基础gulp构建

    在学习前,先谈谈大致使用gulp的步骤,给读者以初步的认识.首先当然是安装nodejs,通过nodejs的npm全局安装和项目安装gulp,其次在项目里安装所需要的gulp插件,然后新建gulp的配置 ...

  4. Routing 为 Magento 2 一个重要的部分,本文介绍基本应用

    Routing 为 Magento 2 一个重要的部分,本文介绍基本应用 Magento 2请求的流程 在Magento 2中,请求URL将如下所示: http://example.com/index ...

  5. radio,check美化

    单选框与复选框原生控件美化有多种解决方案,现在采用经典的input+label的方式自己实现一种 思路: input 和label 通过id和for属性关联,点击label时,input选中状态改变 ...

  6. 解决mysql表不能查询修改删除等操作并出现卡死

    问题现象1:进程wait卡住 测试环境mysql出现了一个怪表:select查询表卡死,alter修改表卡死,甚至我不想要这个表了,delete.truncate.drop表都卡死卡主了...... ...

  7. 我眼里K-Means算法

    在我眼里一切都是那么简单,复杂的我也看不懂,最讨厌那些复杂的人际关系,唉,像孩子一样交流不好吗. 学习K-Means算法时,会让我想起三国志这个游戏,界面是一张中国地图,诸侯分立,各自为据.但是游戏开 ...

  8. MySQL5.7.23解压版安装教程

    每次找安装教程太麻烦,因此给自己备份一下步骤,方便以后查看.解压版下载地址https://dev.mysql.com/downloads/mysql/,详细图解如下: 1.根据自己需求,选择适合自己的 ...

  9. Slow ReadProcessor&amp;Error Slow BlockReceiver错误日志分析(转)

    1.总结 "Slow ReadProcessor" 和"Slow BlockReceiver"往往是因为集群负载比较高或者某些节点不健康导致的,本文主要是帮助你 ...

  10. Kafka实战分析(一)- 设计、部署规划及其调优

    1. Kafka概要设计 kafka在设计之初就需要考虑以下4个方面的问题: 吞吐量/延时 消息持久化 负载均衡和故障转移 伸缩性 1.1 吞吐量/延时 对于任何一个消息引擎而言,吞吐量都是至关重要的 ...