poj 3659 Cell Phone Network USACO 树形DP
2016-06-14 17:29
393 查看
传送门
题目大意:
给出一颗n个节点的树(也就是有n-1条边),请选出最小点数使得所有点被覆盖掉(每个节点可以被自己覆盖,也可以被父亲覆盖,还可以被儿子覆盖)
分析:
好难啊( ⊙ o ⊙ )啊!
f[i][0]代表选择i节点,那么i和i的儿子都被覆盖
f[i][1]代表不选i节点,但是i被儿子覆盖
f[i][2]代表不选i节点,并且i不被儿子覆盖,但是儿子已经被覆盖
f[i][0]+=min(f[to[i]][0],f[to[i]][1],f[to[i]][2])
f[i][2]+=min(f[to[i]][0],f[to[i]][1])
这两个很容易理解
那么f[i][1]怎么转移呢(⊙o⊙)?
我们要保证至少有一个儿子是选择的
所以我们选择k点
f[i][1]=f[k][0]+sum((f[to[i]!=k][1],f[to[i]!=k][0]))
然后O(n)的枚举k点即可O(∩_∩)O哈!
代码如下:
by >o< neighthorn
题目大意:
给出一颗n个节点的树(也就是有n-1条边),请选出最小点数使得所有点被覆盖掉(每个节点可以被自己覆盖,也可以被父亲覆盖,还可以被儿子覆盖)
分析:
好难啊( ⊙ o ⊙ )啊!
f[i][0]代表选择i节点,那么i和i的儿子都被覆盖
f[i][1]代表不选i节点,但是i被儿子覆盖
f[i][2]代表不选i节点,并且i不被儿子覆盖,但是儿子已经被覆盖
f[i][0]+=min(f[to[i]][0],f[to[i]][1],f[to[i]][2])
f[i][2]+=min(f[to[i]][0],f[to[i]][1])
这两个很容易理解
那么f[i][1]怎么转移呢(⊙o⊙)?
我们要保证至少有一个儿子是选择的
所以我们选择k点
f[i][1]=f[k][0]+sum((f[to[i]!=k][1],f[to[i]!=k][0]))
然后O(n)的枚举k点即可O(∩_∩)O哈!
代码如下:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #define inf 0x3f3f3f3f #define MIN(a,b,c) min(a,min(b,c)) using namespace std; const int maxn=10000+5; int n,hd[maxn],to[maxn*2],nxt[maxn*2],cnt,f[maxn][3]; void add(int x,int y){ to[cnt]=y; nxt[cnt]=hd[x]; hd[x]=cnt++; } void dfs(int root,int fa){ int sum=0; f[root][0]=1;//root is chosen and root&root's son are covered f[root][1]=inf;//root is not chosen and root&root's son are covered f[root][2]=0;//root is not chosen and root si not covered ,root's son is covered for(int i=hd[root];i!=-1;i=nxt[i]){ if(to[i]==fa) continue; dfs(to[i],root),sum+=min(f[to[i]][1],f[to[i]][0]); f[root][0]+=MIN(f[to[i]][0],f[to[i]][1],f[to[i]][2]); f[root][2]+=min(f[to[i]][0],f[to[i]][1]); } for(int i=hd[root];i!=-1;i=nxt[i]){ if(to[i]==fa) continue; f[root][1]=min(f[root][1],f[to[i]][0]+sum-min(f[to[i]][0],f[to[i]][1])); } } signed main(void){ memset(hd,-1,sizeof(hd)); scanf("%d",&n),cnt=0; for(int i=1,x,y;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x); memset(f,inf,sizeof(f)); dfs(1,-1); cout<<min(f[1][0],f[1][1])<<endl; return 0; }
by >o< neighthorn
相关文章推荐
- 使用java、javac命令行编译工程以及遇到的问题
- 7-117 错误的模糊引用(类继承问题)
- Android 进程常驻(使用第三方MarsDaemon)(虽然不可用,但是还是保留下。)
- 如何判断一个对象的内容是否为空
- Java的动态代理的理解
- JavaScript笔记整理——递归
- Linux 系统 apache 重启
- Spring Jar包
- 使用Code First 创建映射到现有数据库的基于代码的模型
- linux下利用nohup后台运行jar文件包程序
- redhat6 Centos 6 开放端口
- 项目NDK配置
- 面向切面编程(AOP)的理解
- python datetime 时间日期处理
- ElasticSearch的各种服务的URL
- 一键设置网络IP地址的bat批处理
- [转]在ASP.NET开发中容易忽略的2个小问题 Cookie乱码存取异常 和 iframe弹框的login跳转
- css选择器和xpath对照表
- redis做简单的数据持久化的方法。
- android文本编辑框点击隐藏输入法