题目链接: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+背包思想)相关推荐

  1. P2014-选课【树形dp,背包】

    正题 评测记录:https://www.luogu.org/problemnew/show/P2014 题目大意 有n门课程,每个课程有不同的学分和前修课,必须学了前修课才可以学这门. 只能修m门,求 ...

  2. CodeForces - 1453E Dog Snacks(树形dp+贪心)

    题目链接:点击查看 题目大意:给出一棵有根树,现在需要选择一个最小的 k 值,可以满足下列的 n 次操作: 起始时位于点 1(根节点) 每一步选择一个未被遍历的节点中,距离最近的,且必须满足此距离小于 ...

  3. POJ 1947 Rebuilding Roads (树dp + 背包思想)

    题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...

  4. bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】

    bzoj上是一个森林啊--? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来 ...

  5. [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 ...

  6. Ural 1018 (树形DP+背包+优化)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给 ...

  7. HDU 5148 Cities 树形DP(背包)

    HDU 5148 题意;n个点的树,第i条边长度为c[i],任意选中k个点为特殊点,这k个点中,任意两点间距离的期望值最小为多少? n<=2000,k<=min(50,n) c[i]< ...

  8. [POI2014]FAR-FarmCraft 树形DP + 贪心思想

    (感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译......) 题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权 ...

  9. TELE (树形DP背包扩展) #by Plato

    http://poj.org/problem?id=3017 题意:N个结点的树,有M个叶子结点,取每条边有花费Ci,取每个叶子结点有价值Pi; 求:在保证总收入(总价值-总花费)>0的情况下, ...

  10. CodeForces - 1118F1 Tree Cutting (Easy Version)(树形dp)

    题目链接:点击查看 题目大意:给定n个点,每个点的权值分别对应颜色:0:无颜色,1:红色,2:蓝色,现在需要切割边,使切割后的两个部分不能出现红色和蓝色掺杂的部分,也就是说两个部分必须只能各自含有一个 ...

最新文章

  1. 设计模式之简单工厂模式
  2. ASP .NET Core使用connection string连接MySQL/MariaDB,并设置UTF-8编码
  3. [Bash Shell] Shell学习笔记
  4. 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口
  5. shell脚本中取消高亮显示_Linux中强大的top命令
  6. 如何通过页面静态化提升论坛性能
  7. hackbar 使用教程_hackbar简单安装使用教程
  8. python中平方怎么表示_python表示平方
  9. 计算机管理下的打印机参数设置,提高办公效率 11种方法设置打印参数
  10. 苹果手机换android,我从苹果手机换回了安卓手机,是怎样的体验呢?
  11. 零基础怎么系统学习大数据?
  12. (3)数据链数层——计算机网络复习笔记
  13. Leetcode.43:(Python)给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
  14. XCTF easyCpp
  15. FFmpeg的HEVC解码器源码简单分析:概述
  16. 流程图中参与者_探索流程参与者的移动流程门户
  17. 第三十一章 : 疑难排解
  18. 如何发布自己的项目到Maven中央仓库?
  19. [vijosP1076]海战
  20. C#监控类属性的更改(大花猫动了哪些小玩具)

热门文章

  1. 在项目中经历生死的系统,才会成熟
  2. ubuntu删除OpenCV
  3. CSDN的访问数据,真是破绽百出
  4. 安卓资源字串中加全角空格、半角空格、换行、@%等特殊字符
  5. 电脑丢失api-ms-win-core-libraryloader-|1-1-1.dll怎么办
  6. linux 系统启动级别,LINUX系统启动级别介绍与解释
  7. php 中文字符串长度_php中计算中文字符串长度、截取中文字符串的函数代码
  8. python控制代码使用的gpu
  9. python函数参数是数据库表名_Python-sqlite中的变量表名称
  10. Matlab 嵌套传递函数简化_MATLAB的数据处理方法及图形绘制详解