传送门

1.树形DP

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #define N 10001
  5.  
  6. using namespace std;
  7.  
  8. int n, cnt;
  9. int f[N][3], head[N], to[N << 1], next[N << 1];
  10. bool vis[N];
  11. //f[i][0]表示当前子树全选中,且根节点有放
  12. //f[i][1]表示当前子树全选中,但根节点没放
  13. //f[i][2]表示除了根节点以外,子树全选中
  14.  
  15. inline int read()
  16. {
  17. int x = 0, f = 1;
  18. char ch = getchar();
  19. for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
  20. for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
  21. return x * f;
  22. }
  23.  
  24. inline void add(int x, int y)
  25. {
  26. to[cnt] = y;
  27. next[cnt] = head[x];
  28. head[x] = cnt++;
  29. }
  30.  
  31. inline void dfs(int u, int fa)
  32. {
  33. int i, v, flag = 0, falg = 0, tmp = 23333333;
  34. f[u][0] = vis[u] = 1;
  35. for(i = head[u]; ~i; i = next[i])
  36. {
  37. v = to[i];
  38. if(!vis[v])
  39. {
  40. dfs(v, u);
  41. flag = 1;
  42. f[u][0] += min(f[v][0], min(f[v][1], f[v][2]));
  43. if(f[v][0] <= f[v][1])
  44. {
  45. f[u][1] += f[v][0];
  46. falg = 1;
  47. }
  48. else f[u][1] += f[v][1];
  49. f[u][2] += f[v][1];
  50. }
  51. }
  52. if(!falg)
  53. {
  54. for(i = head[u]; i ^ -1; i = next[i])
  55. {
  56. v = to[i];
  57. if(v != fa)
  58. tmp = min(tmp, f[u][1] - f[v][1] + f[v][0]);
  59. }
  60. f[u][1] = tmp;
  61. }
  62. if(!flag) f[u][1] = 23333333;
  63. }
  64.  
  65. int main()
  66. {
  67. int i, x, y;
  68. n = read();
  69. memset(head, -1, sizeof(head));
  70. for(i = 1; i < n; i++)
  71. {
  72. x = read();
  73. y = read();
  74. add(x, y);
  75. add(y, x);
  76. }
  77. dfs(1, 0);
  78. printf("%d\n", min(f[1][0], f[1][1]));
  79. return 0;
  80. }

 

2.贪心

如果一个点的孩子节点或父亲节点有放,那么这个点就不用放了,如果这个点的儿子节点都没放,并且这个点和父亲节点也没放,那么就放在父节点上,ans++

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #define N 10001
  5.  
  6. using namespace std;
  7.  
  8. int n, cnt, ans;
  9. int head[N], to[N << 1], next[N << 1];
  10. bool vis[N], f[N];
  11.  
  12. inline int read()
  13. {
  14. int x = 0, f = 1;
  15. char ch = getchar();
  16. for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
  17. for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
  18. return x * f;
  19. }
  20.  
  21. inline void add(int x, int y)
  22. {
  23. to[cnt] = y;
  24. next[cnt] = head[x];
  25. head[x] = cnt++;
  26. }
  27.  
  28. inline void dfs(int u, int fa)
  29. {
  30. int i, v, flag = 0;
  31. //flag判断是否有儿子被覆盖
  32. vis[u] = 1;
  33. for(i = head[u]; ~i; i = next[i])
  34. {
  35. v = to[i];
  36. if(!vis[v])
  37. {
  38. dfs(v, u);
  39. if(f[v]) flag = 1;
  40. }
  41. }
  42. if(!flag && !f[u] && !f[fa]) f[fa] = 1, ans++;
  43. }
  44.  
  45. int main()
  46. {
  47. int i, x, y;
  48. n = read();
  49. memset(head, -1, sizeof(head));
  50. for(i = 1; i < n; i++)
  51. {
  52. x = read();
  53. y = read();
  54. add(x, y);
  55. add(y, x);
  56. }
  57. dfs(1, 0);
  58. printf("%d\n", ans);
  59. return 0;
  60. }

  

[BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)的更多相关文章

  1. 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp

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

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

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

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

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

  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. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

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

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

  8. USACO2008 Jan 电话网络

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

  9. bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心

    题意: $mhy$ 住在一棵有 $n$ 个点的树的 $1$ 号结点上,每个结点上都有一个妹子. $mhy$ 从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装 $zhx$ 牌杀毒 ...

随机推荐

  1. css布局:左边固定宽度,右边自适应宽度或右侧固定,左侧自适应三种方法

    方法一:浮动布局 这种方法我采用的是左边浮动,右边加上一个margin-left值,让他实现左边固定,右边自适应的布局效果 HTML Markup <div id="left" ...

  2. (转)Linux下清理Cache方法

    频繁的文件访问会导致系统的Cache使用量大增, 系统运行缓慢. 1 首先用free 命令查看内存的使用:$ free -m             total       used       fr ...

  3. ycsb模板介绍

    #对应的mongodb uri参数等mongodb.url=mongodb://127.0.0.1:27010/test_1 #对应的mongo数据库名称mongodb.database=test_1 ...

  4. cocoapods学习

    1.安装 http://stackoverflow.com/questions/16459028/rvm-install-error-running-requirements-osx-port-ins ...

  5. JSON数组不用字符串转换的写法

    var organization = []; //机构组织 //初始化用户数据列表中用户机构列的数据源 admin.ajax("GetOrganizationInfo", null ...

  6. mvc工作总结

    MVC的页面跳转方式(放在一般类): filterContext.Result = new RedirectResult("controller/action"); filterC ...

  7. linux下使用OpenCV的一些问题

    完整正确的代码如下: import cv2 import numpy as np image = cv2.imread('Pictures/a.png') cv2.imshow('original_i ...

  8. urlrrtrieve()实例_下载微博短视频

    1.确定目标 在微博页面找一想要下载的短视频,通过审查元素找到视频的url. 如://f.us.sinaimg.cn/00150tBNlx07l0qjoSJi01040201m7z90k010.mp4 ...

  9. [已解决]gitee初次使用git clone报错

    本文描述的错误按实际出现先后顺序排列,并且附上一些其他可能会出现的问题 错误1: JZKJ@DESKTOP-I7Q9QJ4 MINGW64 ~ $ git clone https://gitee.co ...

  10. python之编码的进阶

    识记点: ascii 不支持中文 gbk 国标 中文2 英文1 unicode 万国码 英文2 中文4 utf-8 英文1 欧洲2 亚洲3 硬盘中存储的是字节 用什么编码就用什么解码 # 一段文字的转 ...