题目大概说有一棵树要给结点染色0或1,要求所有度为1的结点一半是0一半是1,然后问怎么染色,使两端点颜色不一样的边最少。

  • dp[0/1][u][x]表示以u结点为根的子树中u结点是0/1色 且其子树有x个结点染成1色 的最少边数

转移就是树上背包了。有点就是各个子树必须选,这种形式的树上背包之前做过,我的做法是用了tmp数组来更新最后再写入根的状态数组中,另外我特判了第一个子树的转移方式。。写得好像有点挫。。

另外根随便选一个度不为1的即可。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 5500 struct Edge{
int v,next;
}edge[MAXN<<];
int NE,head[MAXN];
void addEdge(int u,int v){
edge[NE].v=v; edge[NE].next=head[u];
head[u]=NE++;
} int leafcnt[MAXN];
void getlc(int u,int fa){
bool isleaf=;
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
if(v==fa) continue;
getlc(v,u);
leafcnt[u]+=leafcnt[v];
isleaf=;
}
if(isleaf) leafcnt[u]=;
} int d[][MAXN][MAXN];
void dfs(int u,int fa){
bool isfirst=,isleaf=;
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
if(v==fa) continue;
isleaf=;
dfs(v,u);
if(isfirst){
isfirst=;
for(int j=; j<=leafcnt[u]; ++j){
d[][u][j]=min(d[][v][j],d[][v][j]+);
d[][u][j]=min(d[][v][j],d[][v][j]+);
}
}else{
int tmp[][MAXN];
for(int j=; j<=leafcnt[u]; ++j){
tmp[][j]=tmp[][j]=;
}
for(int j=leafcnt[u]; j>=; --j){
for(int k=; k<=min(leafcnt[v],j); ++k){
tmp[][j]=min(tmp[][j],d[][u][j-k]+d[][v][k]+);
tmp[][j]=min(tmp[][j],d[][u][j-k]+d[][v][k]);
tmp[][j]=min(tmp[][j],d[][u][j-k]+d[][v][k]);
tmp[][j]=min(tmp[][j],d[][u][j-k]+d[][v][k]+);
}
}
for(int j=; j<=leafcnt[u]; ++j){
d[][u][j]=tmp[][j];
d[][u][j]=tmp[][j];
}
}
}
if(isleaf){
d[][u][]=;
d[][u][]=;
}
} int deg[MAXN];
int main(){
int n;
scanf("%d",&n);
memset(head,-,sizeof(head));
int a,b;
for(int i=; i<n; ++i){
scanf("%d%d",&a,&b);
addEdge(a,b);
addEdge(b,a);
++deg[a]; ++deg[b];
}
int root;
for(int i=; i<=n; ++i){
if(deg[i]!=){
root=i;
break;
}
}
getlc(root,root);
for(int i=; i<=n; ++i){
for(int j=; j<=n; ++j){
d[][i][j]=d[][i][j]=;
}
}
dfs(root,root);
printf("%d",min(d[][root][leafcnt[root]/],d[][root][leafcnt[root]/]));
return ;
}

Codeforces 581F Zublicanes and Mumocrates(树形DP)的更多相关文章

  1. Codeforces 581F Zublicanes and Mumocrates 树形dp

    Zublicanes and Mumocrates dp[ i ][ j ][ k ] 表示 以 i 为根的子树, 占领 i 的 是 j 并且第一个人占了 i 子树的 k 个叶子节点的最小值. 然后随 ...

  2. Codeforces 581F Zublicanes and Mumocrates - 树形动态规划

    It's election time in Berland. The favorites are of course parties of zublicanes and mumocrates. The ...

  3. Codeforces 581F Zublicanes and Mumocrates(树型DP)

    题目链接  Round 322 Problem F 题意  给定一棵树,保证叶子结点个数为$2$(也就是度数为$1$的结点),现在要把所有的点染色(黑或白) 要求一半叶子结点的颜色为白,一半叶子结点的 ...

  4. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  5. codeforces 337D Book of Evil (树形dp)

    题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...

  6. Codeforces 1276D - Tree Elimination(树形 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 繁琐的简单树形 dp(大雾),要是现场肯定弃了去做 F 题 做了我一中午,写篇题解纪念下. 提供一种不太一样的思路. 首先碰到这样的题肯定 ...

  7. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  8. Codeforces 815C Karen and Supermarket 树形dp

    Karen and Supermarket 感觉就是很普通的树形dp. dp[ i ][ 0 ][ u ]表示在 i 这棵子树中选择 u 个且 i 不用优惠券的最小花费. dp[ i ][ 1 ][ ...

  9. Codeforces 627D Preorder Test(二分+树形DP)

    题意:给出一棵无根树,每个节点有一个权值,现在要让dfs序的前k个结点的最小值最大,求出这个值. 考虑二分答案,把>=答案的点标记为1,<答案的点标记为0,现在的任务时使得dfs序的前k个 ...

随机推荐

  1. cf118A(水题)

    题意就是讲给出的字符串元音字母去掉,在每个辅音字母前加点,且小写输出...注意y也要去掉(以我英语挂科的水平也知道y是辅音字母)... 水题.. 直接上代码好了... #include <ios ...

  2. Java之POJO

    转: POJO    一:什么是POJOPOJO的名称有多种,pure old java object .plain ordinary java object 等.按照Martin Fowler的解释 ...

  3. 关于logcat日志

    最近学习android,碰到了logcat,个人总结一下. 当不出日志是解决办法: ProjectMenu---后台设置----LOG设置---LOG开关 Logcat(deprecated)和Log ...

  4. 三、jQuery--Ajax基础--Ajax全接触--JSON

    JSON基本概念 JSON:JavaScript对象表示法(JavaScript Object Notation) JSON是存储和交换文本信息的语法,类似XML.它采用键值对的方式来组织,易于人们阅 ...

  5. C#的扩展方法

    using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...

  6. acpi参考网站

    1.acpi官网: http://www.acpi.info/

  7. 谈谈Delph中的类和对象2---类可以理解成一种特殊的数据结构、类型转换

    三.类可以理解成一种特殊的数据结构 我们知道数据类型可以进行强制类型转换,类既然可以理解成一种数据类型,那么它也应该可以进行类型转换.比如下面代码为一个按钮(Button1)的单击事件 procedu ...

  8. Object.create 函数 (JavaScript)

    创建一个具有指定原型且可选择性地包含指定属性的对象. 语法 Object.create(prototype, descriptors) 参数 prototype 必需.  要用作原型的对象.  可以为 ...

  9. JqueryDemoTools-用于整理jQueryDemo 分类: C# 公共资源 2014-12-02 16:50 224人阅读 评论(1) 收藏

    应用背景: 在学习js时,为了熟悉某个功能,或使用某个插件,往往需要写一个Demo来测试:一些好的Demo也可以整理积累下来,方便以后查阅: 写了一个编写jQuery Demo的辅助工具.界面很简单, ...

  10. android 入门-git之上传本地代码到github

    github部分: 1.首先去github网站 上注册一个用户 2.说明 https://guides.github.com/activities/hello-world/ 2.点击 New repo ...