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个 ... 
随机推荐
- hdu1162(最小生成树 prim or kruscal)
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 意义:给出一些点,用线问使所有点直接或间接连通,需要多长: 思路:裸最小生成树: 法1: pri ... 
- Cocoapods的安装报错 - Error installing pods:activesupport requires Ruby version >=2.2.2
			1.打开终端 2 移除现有 Ruby 默认源 输入以下指令 $gem sources --remove https://rubygems.org/ 3.使用新的源 输入以下指令 $gem source ... 
- 5.1 stack,queue以及priority_queue
			*:stack 使用要包含头文件stack,栈是一种先进后出的元素序列,删除和访问只能对栈顶的元素(最后一个添加的元素)进行,并且添加元素只能添加到栈顶.栈内的元素不能访问,要想访问先要删除其上方的所 ... 
- 三、jQuery--jQuery基础--jQuery基础课程--第8章 jQuery 实现Ajax应用
			1.使用load()方法异步请求数据 使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为:load(url,[data],[callback]) ... 
- Lattice Diamond 和 ispLEVER 的不同之处
			Lattice Diamond 和 ispLEVER.有一些不同,尤其是如何管理工程的不同,包括以下几点: 1.ispLEVER 有多种工程类型,不同的程序文件类型需要不同的类型的工程:但是Diamo ... 
- 查看局域网内在线的主机ip和mac地址
			]# nmap -sP Starting Nmap 5.51 ( http://nmap.org ) at 2016-12-12 22:43 CST Nmap scan report for 192. ... 
- 【C#】Json数据 排版算法
			我从服务器上取得一串Json数据,然后想表示到画面上.不过服务器上取下的Json数据肯定是经过压缩的,空格和换行都没有.如果直接看,可读性非常差. 由于我这个软件是内部管理用的,使用者既能直接看懂Js ... 
- 垂直时间轴HTML
			1.概述 用时间点来展示事件发生点来代替用table展示一条条数据,能够给人清晰.一目了然能够看清事情发生的过程,UI页面也显示的那么清晰.如何用css+html做出时间轴展示事件点的?先来看看下面的 ... 
- 图结构练习——最短路径(dijkstra算法(迪杰斯拉特))
			图结构练习——最短路径 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个带权无向图,求节点1到节点n的最短路径. ... 
- 攻城狮在路上(叁)Linux(二十八)--- 打包命令:tar
			首先介绍一下tar打包命令的基本格式,下面的三种之间不能混淆. tar [-j|-z] [cv] [-f 新文件名] file1 file2 ...; tar [-j|-z] [tv] [-f 新文件 ... 
