Codeforces 581F Zublicanes and Mumocrates(树形DP)
题目大概说有一棵树要给结点染色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)的更多相关文章
- Codeforces 581F Zublicanes and Mumocrates 树形dp
Zublicanes and Mumocrates dp[ i ][ j ][ k ] 表示 以 i 为根的子树, 占领 i 的 是 j 并且第一个人占了 i 子树的 k 个叶子节点的最小值. 然后随 ...
- Codeforces 581F Zublicanes and Mumocrates - 树形动态规划
It's election time in Berland. The favorites are of course parties of zublicanes and mumocrates. The ...
- Codeforces 581F Zublicanes and Mumocrates(树型DP)
题目链接 Round 322 Problem F 题意 给定一棵树,保证叶子结点个数为$2$(也就是度数为$1$的结点),现在要把所有的点染色(黑或白) 要求一半叶子结点的颜色为白,一半叶子结点的 ...
- codeforces 161D Distance in Tree 树形dp
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...
- codeforces 337D Book of Evil (树形dp)
题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...
- Codeforces 1276D - Tree Elimination(树形 dp)
Codeforces 题面传送门 & 洛谷题面传送门 繁琐的简单树形 dp(大雾),要是现场肯定弃了去做 F 题 做了我一中午,写篇题解纪念下. 提供一种不太一样的思路. 首先碰到这样的题肯定 ...
- Codeforces 543D Road Improvement(树形DP + 乘法逆元)
题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...
- Codeforces 815C Karen and Supermarket 树形dp
Karen and Supermarket 感觉就是很普通的树形dp. dp[ i ][ 0 ][ u ]表示在 i 这棵子树中选择 u 个且 i 不用优惠券的最小花费. dp[ i ][ 1 ][ ...
- Codeforces 627D Preorder Test(二分+树形DP)
题意:给出一棵无根树,每个节点有一个权值,现在要让dfs序的前k个结点的最小值最大,求出这个值. 考虑二分答案,把>=答案的点标记为1,<答案的点标记为0,现在的任务时使得dfs序的前k个 ...
随机推荐
- 通过xib加载UITableViewCell的新方式
我们以前通常会这样做 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPa ...
- [Android] Android5.1系统自带的应用启动次数统计
reference to : http://blog.csdn.net/elder_sword/article/details/50508257 前段时间要做一个统计手机中激活量的东东,这个统计不是单 ...
- 二叉树计数(codevs 3112)
题目描述 Description 一个有n个结点的二叉树总共有多少种形态 输入描述 Input Description 读入一个正整数n 输出描述 Output Description 输出一个正整数 ...
- Mysql游标
14.6.6.1 Cursor CLOSE Syntax 14.6.6.2 Cursor DECLARE Syntax 14.6.6.3 Cursor FETCH Syntax 14.6.6.4 Cu ...
- 开启后台 Service 闪退
04-29 15:36:23.395: E/ActivityThread(15275): Performing stop of activity that is not resumed: {com.e ...
- Makefile_:=与=的区别
1."=" make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个makefile中最后被指定的值.看例子: x = foo y ...
- vector 去重复
①首先将vector排序 sort( vecSrc.begin(), vecSrc.end() ); // 1,2,3,3,4,4,6,7,8,9 ②然后使用unique算法,unique返回值是重复 ...
- NYOJ题目842整除的尾数
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsUAAAIMCAIAAACSTkYzAAAgAElEQVR4nO3dO3KjzBrG8bMJ5VqIYx ...
- 四、优化及调试--网站优化--SEO在网页制作中的应用
SEO分类:白帽SEO.黑帽SEO 白帽SEO: 内容上的SEO: 网站标题.关键字.描述 网站内容优化 Robot.txt文件 网站地图 增加外链引用 前端SEO: 网站结构布局优化 扁平化结构(一 ...
- VS使用技巧(转)
转自http://www.cnblogs.com/xpvincent/p/3596553.html i. Ctrl-M-O 折叠所有方法 ii. Ctrl-M-P 展开所有方法并停止大纲显示(不可以再 ...