题意:
John想让他的所有牛用上手机以便相互交流,他需要建立几座信号塔在N块草地中。已知与信号塔相邻的草地能收到信号。给你N-1个草地(A,B)的相邻关系,问:最少需要建多少个信号塔能实现所有草地都有信号。

思路:
开始思考的是使用dp[x][1/0]来表示结点是否有保安来解决这个问题。
但是细想了一下,父亲结点也会影响改结点的状态转移过程,所以两个结点肯定是不可以的。

用dp[x][0/1/2]dp[x][0/1/2]dp[x][0/1/2]来表示x结点被自己/儿子/父亲染色的最小染色数。
很容易就可以写出dp[x][0]dp[x][2]dp[x][0] dp[x][2]dp[x][0]dp[x][2]的转移方程
dp[x][0]+=min(dp[i][0],dp[i][1],dp[i][2]);dp[x][0]+=min(dp[i][0],dp[i][1],dp[i][2]);dp[x][0]+=min(dp[i][0],dp[i][1],dp[i][2]); // iii是xxx的孩子结点
dp[x][2]+=min(dp[i][0],dp[i][1])dp[x][2]+=min(dp[i][0],dp[i][1])dp[x][2]+=min(dp[i][0],dp[i][1])

但是dp[x][1]似乎不是那么好转移,因为只要他有一个孩子染了色,就可以。
所以我们想,只要在保证他最少有一个孩子被染了色的情况下进行
dp[x][1]+=min(dp[i][0],dp[i][1])dp[x][1]+=min(dp[i][0],dp[i][1])dp[x][1]+=min(dp[i][0],dp[i][1])转移不就可以了。
详情见代码注释。
代码:

//#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+10;
#define endl '\n'vector<int> edge[maxn];
int dp[maxn][3];void dfs(int x,int fa){int tot=0;dp[x][0]=1;int len=edge[x].size();for(auto i:edge[x]){if(i==fa) continue;dfs(i,x);dp[x][0]+=min(dp[i][0],min(dp[i][1],dp[i][2]));dp[x][2]+=min(dp[i][0],dp[i][1]);if(dp[i][0]>dp[i][1]&&tot<len-2){  //至少要保证有一个孩子染色了,并且父亲也连接着这个节点,//所以小于len-2dp[x][1]+=dp[i][1];tot++;//tot记录当前选择了几个没有被染色的孩子结点//要保证数量小于len-2}else dp[x][1]+=dp[i][0];}if(edge[x].size()==1&&x!=1) dp[x][1]=1e9;
}signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin>>n;for(int i=0;i<n-1;i++){int x,y;cin>>x>>y;edge[x].push_back(y);edge[y].push_back(x);}dfs(1,0);cout<<min(dp[1][0],dp[1][1])<<endl;
}

[USACO08JAN]Cell Phone Network G 树形dp相关推荐

  1. *【POJ - 3659】Cell Phone Network (树形dp,最小支配集)

    题干: Farmer John has decided to give each of his cows a cell phone in hopes to encourage their social ...

  2. [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)

    [洛谷 P4084 USACO17DEC] Barn Painting G 题目链接 大致题意: 给定一颗N个节点组成的树,3种颜色,其中K个节点已染色,要求任意两相邻节点颜色不同,求合法染色方案数 ...

  3. USACO 2008 Jan Gold 3.Cell Phone Network 树形dp

    本题的大意就是在一棵树上选一些节点,被选中的节点可以覆盖他相 邻的点,问最少需要放几个节点\text{本题的大意就是在一棵树上选一些节点,被选中的节点可以覆盖他相 邻的点,问最少需要放几个节}\\\t ...

  4. Codeforces Round #786 (Div. 3) G. Remove Directed Edges——树形dp+记忆化

    思路参考 题目链接 思路 题目要求删除一些边,要让最后每个点的入度,出度都小于最开始的情况,或者等于0. 那么出度为1或者入度为1的边一定会被删掉,而且题目说明不存在重边和环,最后的结果一定是一条链. ...

  5. 牛客假日团队赛8:H.Cell Phone Network(最小支配集)

    链接:https://ac.nowcoder.com/acm/contest/1069/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6553 ...

  6. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  7. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  8. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  9. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

最新文章

  1. SASS type-of 函数
  2. 在Eclipse中给JRE-Library添加本地Javadoc
  3. C语言 | 内存对齐03 - 内存对齐的公式
  4. hadoop2.x伪集群搭建全流程
  5. SCCM2007系列教程之八资产管理
  6. python在线怎么发音-Python如何实现文本转语音
  7. 缺少训练样本怎么做实体识别?小样本下的NER解决方法汇总
  8. Python调用海康威视网络相机_调用海康SDK
  9. 西门子触摸屏程序锁屏V1.0
  10. 练习如下命令的使用: set mset get mget keys type exists ttl expire move 、select del flushdb flusha
  11. 自然辩证法(研究生)期末考试题库
  12. Java开发中Word转PDF文件5种方案横向评测
  13. 基于加密短信验证码的蓝牙智能锁设计
  14. 通过docker部署一个简单的web服务
  15. RDD:基于内存的集群计算容错抽象(转)
  16. hugo使用katex
  17. 分析肖特基二极管的优势与结构应用
  18. 乐吾乐2D可视化为智慧电力赋能(二)
  19. 移动端开发,苹果手机样式乱,iphon7不支持white-space属性,控制显示几行
  20. 网络直播不应只是秀场,新的场景机会在哪?

热门文章

  1. 存储器里面的一个采用直接映射方式的32KB缓存-一个四路组相连的缓存,容量为16KB
  2. linux系统版本间的区别是什么?内核又是什么
  3. CVPR | 让合成图像更真实,上交大提出基于域验证的图像和谐化
  4. 如何用 OpenCV、Python 和深度学习实现面部识别?
  5. 卷积神经网络如何处理一维时间序列数据?
  6. docker-compose编排最佳实战(多服务)
  7. java调用PageOffice生成word
  8. MySQL解压版配置
  9. 目标跟踪之粒子滤波---Opencv实现粒子滤波算法
  10. 把一台Cisco路由器配置为帧中继交换机