题目描述

Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流。不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来保证任意两块草地间都存在手机信号。所有的N块草地按1..N 顺次编号。 所有草地中只有N-1对是相邻的,不过对任意两块草地A和B(1 <= A <= N; 1 <= B <= N; A != B),都可以找到一个以A开头以B结尾的草地序列,并且序列中相邻的编号所代表的草地相邻。无线电通讯塔只能建在草地上,一座塔的服务范围为它所在的那块草地,以及与那块草地相邻的所有草地。 请你帮FJ计算一下,为了建立能覆盖到所有草地的通信系统,他最少要建多少座无线电通讯塔。

输入

* 第1行: 1个整数,N

* 第2..N行: 每行为2个用空格隔开的整数A、B,为两块相邻草地的编号

输出

* 第1行: 输出1个整数,即FJ最少建立无线电通讯塔的数目

样例输入

5
1 3
5 2
4 3
3 5

样例输出

2


题解

树形dp。

f[x]表示子树x完全被覆盖,且x有信号塔的最小数量,

g[x]表示子树x完全被覆盖,且x无信号塔的最小数量,

h[x]表示子树x除x以外被覆盖的最小数量。

那么有f[x]=1+∑min(f[to[i]],g[to[i]],h[to[i]]),

h[x]=∑g[to[i]],

g[x]=∑min(f[to[i]],g[to[i]])+min(f[to[i]]-min(f[to[i]],g[to[i]])。

原理不难想,很好推。

最终答案为min(f[1],g[1])。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define inf 0x07ffffff
  4. int to[20001] , next[20001] , head[10001] , f[10001] , g[10001] , h[10001] , cnt;
  5. int min(int a , int b)
  6. {
  7. return a < b ? a : b;
  8. }
  9. void add(int x , int y)
  10. {
  11. to[cnt] = y;
  12. next[cnt] = head[x];
  13. head[x] = cnt ++ ;
  14. }
  15. void dp(int x , int last)
  16. {
  17. int i , y , sum = 0;
  18. f[x] = 1;
  19. g[x] = inf;
  20. for(i = head[x] ; i != -1 ; i = next[i])
  21. {
  22. y = to[i];
  23. if(y == last)
  24. continue;
  25. dp(y , x);
  26. f[x] += min(f[y] , min(g[y] , h[y]));
  27. h[x] += g[y];
  28. sum += min(f[y] , g[y]);
  29. }
  30. for(i = head[x] ; i != -1 ; i = next[i])
  31. {
  32. y = to[i];
  33. if(y == last)
  34. continue;
  35. g[x] = min(g[x] , sum + f[y] - min(f[y] , g[y]));
  36. }
  37. }
  38. int main()
  39. {
  40. int n , i , x , y;
  41. scanf("%d" , &n);
  42. memset(head , -1 , sizeof(head));
  43. for(i = 1 ; i <= n - 1 ; i ++ )
  44. {
  45. scanf("%d%d" , &x , &y);
  46. add(x , y);
  47. add(y , x);
  48. }
  49. dp(1 , 0);
  50. printf("%d\n" , min(f[1] , g[1]));
  51. return 0;
  52. }

【bzoj1596】[Usaco2008 Jan]电话网络 树形dp的更多相关文章

  1. BZOJ 1596: [Usaco2008 Jan]电话网络 树形DP

    挺经典的,细节需要特别注意一下 Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s& ...

  2. BZOJ1596: [Usaco2008 Jan]电话网络

    1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 513  Solved: 232[Submit][S ...

  3. [BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)

    传送门 1.树形DP #include <cstdio> #include <cstring> #include <iostream> #define N 1000 ...

  4. BZOJ1596 [Usaco2008 Jan]电话网络 【树形dp】

    题目链接 BZOJ1596 题解 先抽成有根树 设\(f[i][0|1][0|1]\)表示以\(i\)为根,儿子都覆盖了,父亲是否覆盖,父亲是否建塔的最少建塔数 转移一下即可 #include< ...

  5. 1596: [Usaco2008 Jan]电话网络

    1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 601  Solved: 265[Submit][S ...

  6. 【bzoj1596】[Usaco2008 Jan]电话网络

    题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...

  7. USACO2008 Jan 电话网络

    Time Limit: 10 Sec Memory Limit: 162 MB Description Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶 ...

  8. 【BZOJ】1596: [Usaco2008 Jan]电话网络(树形dp+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1596 一开始交了个貌似正确的dp,wa了. 我只考虑了儿子覆盖的情况,没有考虑父亲QAQ 那么我们要 ...

  9. BZOJ 1596: [Usaco2008 Jan]电话网络

    Description Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无 ...

随机推荐

  1. 北京Uber优步司机奖励政策(12月20日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 成都Uber优步司机奖励政策(1月29日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 【转载】COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM

    原文:COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM 原文:http://www.codeproject.com/Articles/633/Introduction-to-CO ...

  4. memory引擎和innodb引擎速度对比

    ysql> insert into innodb_test (name) select name from innodb_test; Query OK, rows affected ( min ...

  5. 「日常训练&知识学习」莫队算法(二):树上莫队(Count on a tree II,SPOJ COT2)

    题意与分析 题意是这样的,给定一颗节点有权值的树,然后给若干个询问,每次询问让你找出一条链上有多少个不同权值. 写这题之前要参看我的三个blog:Codeforces Round #326 Div. ...

  6. jmeter获取cookies

    使用场景:登录后,后续的请求操作需获取到JSESSIONID才可进行 1.将jmeter的bin目录下的jmeter.properties文件中的CookieManager.save.cookies= ...

  7. Siki_Unity_1-8_使用Unity开发2D游戏_PongGame

    Unity 1-8 使用Unity开发2D游戏 PongGame 任务1:演示 http://pan.baidu.com/s/1pKUHsev; up2i 任务2:案例介绍 创建PongGame,注意 ...

  8. 【转】网游服务器中的GUID(唯一标识码)实现-基于snowflake算法

    本文中的算法采用twitter的snowflake算法,具体请搜索介绍,原来是用Scala写的,因我项目需要,改写成C++语言,主要用于高效的生成唯一的ID, 核心算法就是毫秒级时间(41位)+机器I ...

  9. 数据库Mysql的学习(五)-运算符与函数

    ,store,store,store,store FROM bookinfo;//加减乘除取余 //余额大于200 //余额不等于200 SELECT * FROM readerinfo WHERE ...

  10. 小猫爬山:dfs

    题目描述: 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). 翰翰和达达只好花钱让它们坐索道下山. ...