最小点队的题意:https://www.luogu.com.cn/problem/P2899

与战略游戏不同的是,这里要求占领所有的点而不是边。


1自己被自己染色(有信号塔)

这时我们可以想一下,u被自己染色可以由什么转移过来,如果u已经被自己染色了的话,他的儿子v可以选择自己染色,也可以选择被自己(vv)的儿子染色,当然也可以被u染色,当然,我们要选最小的,所以转移方程就是

f [ u ] [ 0 ]  +=  min ( f [ v ] [ 0 ] ,   f  [ v ] [ 1 ] ,  f [ v ] [ 2 ] )

2.被自己的父亲结点染色(自己没有信号塔)

如果被父亲结点(fa)染色了,那么u的儿子v只能选择自己染色或者被它的儿子染色,转移方程为

f [ u ] [ 1 ]  += min  ( f [ v ] [ 0 ] ,  f [ v ] [ 2 ] )

3.被自己的儿子结点染色(自己没有信号塔)

这是最麻烦的一种情况,因为u可能有多个儿子,只要有一个儿子自己染色了,就可以将u覆盖,这种情况就成立了。

那我们就用一个flag记号来考察,在转移的时候,是不是曾经从有信号塔的儿子( dp [ v ] [ 0 ] )转移过来

如果有,那皆大欢喜,什么都不用做。

相反,如果没有,就说明所有状态都是由没有信号塔的儿子( dp [ v ] [ 2 ] ) 转移而来

那我们就应该找一个儿子,把那个儿子换成 dp [ v ] [ 0 ]

找哪个儿子呢?当然是 dp [ v ] [ 0 ] - dp [ v ] [ 2 ] 最小的那个儿子

#include <bits/stdc++.h>
using namespace std;
const int maxn=;
int n;
vector<int>vec[maxn];
int vis[maxn],dp[maxn][];
//dp[now][0]自己覆盖自己,放信号塔
//dp[now][1]父亲覆盖自己,本身不放信号塔
//dp[now][2]儿子覆盖自己,本身不放信号塔
void dfs(int now)
{
int flag=,p=;
dp[now][]=;
for(int i=;i<vec[now].size();i++)
{
int w=vec[now][i];
if(vis[w]) continue;
vis[w]=;
dfs(w);
dp[now][]+=min(dp[w][],min(dp[w][],dp[w][]));//儿子随意
dp[now][]+=min(dp[w][],dp[w][]);
// dp[now][2]+=min(dp[w][0],dp[w][2]);
if(dp[w][]<=dp[w][])
{
flag=;
dp[now][]+=dp[w][];
}
else
{
dp[now][]+=dp[w][];
p=min(p,dp[w][]-dp[w][]);
}
}
if(flag==) dp[now][]+=p;
}
int main()
{
cin>>n;
for(int i=;i<=n-;i++)
{
int l,r;
cin>>l>>r;
vec[l].push_back(r);
vec[r].push_back(l);
}
vis[]=;
dfs();
cout<<min(dp[][],dp[][]);
}

Cell Phone Network G的更多相关文章

  1. 树的最小支配集 E - Cell Phone Network POJ - 3659 E. Tree with Small Distances

    E - Cell Phone Network POJ - 3659 题目大意: 给你一棵树,放置灯塔,每一个节点可以覆盖的范围是这个节点的所有子节点和他的父亲节点,问要使得所有的节点被覆盖的最少灯塔数 ...

  2. 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463

    B - Strategic game POJ - 1463   题目大意:给你一棵树,让你放最少的东西来覆盖所有的边   这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...

  3. [USACO08JAN]手机网络Cell Phone Network

    [USACO08JAN]手机网络Cell Phone Network 题目描述 Farmer John has decided to give each of his cows a cell phon ...

  4. POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法

    POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...

  5. POJ 3659 Cell Phone Network(树的最小支配集)(贪心)

    Cell Phone Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6781   Accepted: 242 ...

  6. 洛谷P2899 [USACO08JAN]手机网络Cell Phone Network

    P2899 [USACO08JAN]手机网络Cell Phone Network 题目描述 Farmer John has decided to give each of his cows a cel ...

  7. 洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network(树形动规)

    题目描述 Farmer John has decided to give each of his cows a cell phone in hopes to encourage their socia ...

  8. 洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network

    题目描述 Farmer John has decided to give each of his cows a cell phone in hopes to encourage their socia ...

  9. POJ 3659 Cell phone Network (树的最小点覆盖, 树形DP)

    题意: 给定一棵树,每个点可以覆盖自己和相邻的点, 求最少要多少个点覆盖图 #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. group_concat有长度限制

    group_concat有长度限制     group_concat 详细用法请点此链接.   group_concat有长度限制!长度陷阱用了group_concat后,select里如果使用了li ...

  2. 线程池:Execution框架

    每问题每线程:在于它没有对已创建线程的数量进行任何限制,除非对客户端能够抛出的请求速率进行限制. 下边 有些图片看不到,清看原地址:http://www.360doc.com/content/10/1 ...

  3. Python财经数据接口包TuShare的使用

    安装TuShare 方式1:pip install tushare 方式2:访问https://pypi.python.org/pypi/tushare/下载安装 方式3:将源代码下载到本地pytho ...

  4. 最长公共子窜和最长公共子序列(LCS)

    他们都是用dp做;复杂度都是O(N方) 有一个大佬的博客写的很详细,是关于最长公共子序列的:https://blog.csdn.net/hrn1216/article/details/51534607 ...

  5. 怎么用python 3 开发钉钉群机器人

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Python绿色通道 PS:如有需要Python学习资料的小伙伴可以加 ...

  6. ado.net 面向对象

    面向对象:就是一个大的转换器,建立起一条通道通往数据库然后通过通道将所需(方法)数据从转换器往返于外部界面端 1   首先在项目里创建文件夹:      右击项目———添加个文件夹App_Cod 2 ...

  7. wechall前十题

    今天开始打一打wechall 累了打wechall,不累的时候开始打buu 第一题:Get Sourced 查看源代码即可,拉到底部 第二题:Stegano 属于misc的范畴,直接下载下来,然后no ...

  8. mybatis源码学习:基于动态代理实现查询全过程

    前文传送门: mybatis源码学习:从SqlSessionFactory到代理对象的生成 mybatis源码学习:一级缓存和二级缓存分析 下面这条语句,将会调用代理对象的方法,并执行查询过程,我们一 ...

  9. java实现自定义哈希表

    哈希表实现原理 哈希表底层是使用数组实现的,因为数组使用下标查找元素很快.所以实现哈希表的关键就是把某种数据类型通过计算变成数组的下标(这个计算就是hashCode()函数 比如,你怎么把一个字符串转 ...

  10. input框处理大全

    1.去掉谷歌input记住账号或密码时默认出现的黄色背景: 直接用css的内阴影来覆盖黄色(代码中 white可换成其他颜色) input:-webkit-autofill { -webkit-box ...