codeforces 212E IT Restaurants(树形dp+背包思想)
题目链接:http://codeforces.com/problemset/problem/212/E
题目大意:给你一个无向树,现在用两种颜色去给这颗树上的节点染色。用(a,b)表示两种颜色分别染的节点数。满足以下条件:1.任何一种颜色至少使用一次,即a>=1&&b>=1。2.两种颜色染的节点不能相邻,即不能有边的两端染不同色。要你使a+b值最大下输出不同的(a,b),按照a升序输出。
算法思路:很容易得出一个结论:a+b的最大值就是取n-1,即只有一个点不染色。我们就想到树形dp。先dfs求出以每个节点为根的树的节点数。假如我们讨论以u为根的树的染色方案,我们就要知道u的字树与父亲上面的节点数能够凑出的不同a(知道a,就知道了b)。
这个地方就要用到背包了。具体看代码:
代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<vector> using namespace std;const int maxn = 5105; const int INF = 0x3f3f3f3f;vector<int> G[maxn]; int n; int num[maxn]; //num[i],以i为根的数的节点个数。 bool dp[maxn][maxn]; //dp[i][j]表示以i为根的数,是否能够凑出一个a为j的数。 bool flag[maxn]; //flag[i]表示这棵树是否能够凑出a == ivoid dfs(int u,int fa) {num[u] = 1;dp[u][0] = 1;int sz = G[u].size();for(int i=0; i<sz; i++){int v = G[u][i];if(v == fa) continue;dfs(v,u);num[u] += num[v];for(int i=n-1; i>=0; i--){if(dp[u][i])dp[u][i+num[v]] = 1;}}int fanum = n - num[u];for(int i=n-1; i>=0; i--){if(dp[u][i])dp[u][i+fanum] = 1;}for(int i=1; i<n-1; i++){if(dp[u][i])flag[i] = true;} }int main() {//freopen("E:\\acm\\input.txt","r",stdin);cin>>n;for(int i=1; i<=n; i++) G[i].clear();for(int i=1; i<n; i++){int u,v;scanf("%d %d",&u,&v);G[u].push_back(v);G[v].push_back(u);}memset(dp,0,sizeof(dp));memset(flag,0,sizeof(flag));dfs(1,-1);int ans = 0;for(int i=1; i<n; i++)if(flag[i])ans++;printf("%d\n",ans);for(int i=1; i<n-1; i++){if(flag[i])printf("%d %d\n",i,n-i-1);} }
View Code
转载于:https://www.cnblogs.com/acmdeweilai/p/3330574.html
codeforces 212E IT Restaurants(树形dp+背包思想)相关推荐
- P2014-选课【树形dp,背包】
正题 评测记录:https://www.luogu.org/problemnew/show/P2014 题目大意 有n门课程,每个课程有不同的学分和前修课,必须学了前修课才可以学这门. 只能修m门,求 ...
- CodeForces - 1453E Dog Snacks(树形dp+贪心)
题目链接:点击查看 题目大意:给出一棵有根树,现在需要选择一个最小的 k 值,可以满足下列的 n 次操作: 起始时位于点 1(根节点) 每一步选择一个未被遍历的节点中,距离最近的,且必须满足此距离小于 ...
- POJ 1947 Rebuilding Roads (树dp + 背包思想)
题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...
- bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】
bzoj上是一个森林啊--? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来 ...
- [BZOJ1017][树形DP][背包DP]JSOI2008:魔兽地图DotR
BZOJ1017 每个装备可以直接贡献,也可以用于合成 设 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示第 i i i件装备, j j j件用于合成,花费 k ...
- Ural 1018 (树形DP+背包+优化)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给 ...
- HDU 5148 Cities 树形DP(背包)
HDU 5148 题意;n个点的树,第i条边长度为c[i],任意选中k个点为特殊点,这k个点中,任意两点间距离的期望值最小为多少? n<=2000,k<=min(50,n) c[i]< ...
- [POI2014]FAR-FarmCraft 树形DP + 贪心思想
(感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译......) 题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权 ...
- TELE (树形DP背包扩展) #by Plato
http://poj.org/problem?id=3017 题意:N个结点的树,有M个叶子结点,取每条边有花费Ci,取每个叶子结点有价值Pi; 求:在保证总收入(总价值-总花费)>0的情况下, ...
- CodeForces - 1118F1 Tree Cutting (Easy Version)(树形dp)
题目链接:点击查看 题目大意:给定n个点,每个点的权值分别对应颜色:0:无颜色,1:红色,2:蓝色,现在需要切割边,使切割后的两个部分不能出现红色和蓝色掺杂的部分,也就是说两个部分必须只能各自含有一个 ...
最新文章
- 设计模式之简单工厂模式
- ASP .NET Core使用connection string连接MySQL/MariaDB,并设置UTF-8编码
- [Bash Shell] Shell学习笔记
- 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口
- shell脚本中取消高亮显示_Linux中强大的top命令
- 如何通过页面静态化提升论坛性能
- hackbar 使用教程_hackbar简单安装使用教程
- python中平方怎么表示_python表示平方
- 计算机管理下的打印机参数设置,提高办公效率 11种方法设置打印参数
- 苹果手机换android,我从苹果手机换回了安卓手机,是怎样的体验呢?
- 零基础怎么系统学习大数据?
- (3)数据链数层——计算机网络复习笔记
- Leetcode.43:(Python)给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
- XCTF easyCpp
- FFmpeg的HEVC解码器源码简单分析:概述
- 流程图中参与者_探索流程参与者的移动流程门户
- 第三十一章 : 疑难排解
- 如何发布自己的项目到Maven中央仓库?
- [vijosP1076]海战
- C#监控类属性的更改(大花猫动了哪些小玩具)
热门文章
- 在项目中经历生死的系统,才会成熟
- ubuntu删除OpenCV
- CSDN的访问数据,真是破绽百出
- 安卓资源字串中加全角空格、半角空格、换行、@%等特殊字符
- 电脑丢失api-ms-win-core-libraryloader-|1-1-1.dll怎么办
- linux 系统启动级别,LINUX系统启动级别介绍与解释
- php 中文字符串长度_php中计算中文字符串长度、截取中文字符串的函数代码
- python控制代码使用的gpu
- python函数参数是数据库表名_Python-sqlite中的变量表名称
- Matlab 嵌套传递函数简化_MATLAB的数据处理方法及图形绘制详解