[bzoj1369][Baltic2003]Gem_树形dp_结论题

Gem bzoj-1369 Baltic-2003

题目大意:给你一棵树,让你往节点上添自然数,使得任意相邻节点的数不同且使得权值最小。

注释:n为结点个数,$1\le n\le 10^3$。

想法:呵呵,学长一直在骂结论题,我一直觉得没啥.. ...

知道tm碰见这玩意儿,卧槽?!

树上相邻节点不同色,颜色个数最小值至多为logn。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#define ll long long
#define inf 1000000000
using namespace std;
ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int n,cnt;
int last[10005],f[10005][25];
struct edge
{
	int to,next;
}e[20005];
void insert(int u,int v)
{
	e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;
	e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;
}
void dp(int x,int fa)
{
	for(int j=1;j<=20;j++)
		f[x][j]=j;
	for(int i=last[x];i;i=e[i].next)
		if(e[i].to!=fa)
			dp(e[i].to,x);
	for(int j=1;j<=20;j++)
	{
		for(int i=last[x];i;i=e[i].next)
			if(e[i].to!=fa)
			{
				int mn=inf;
				for(int k=1;k<=20;k++)
					if(j!=k)mn=min(mn,f[e[i].to][k]);
				f[x][j]+=mn;
			}
	}
}
int main()
{
	n=read();
	for(int i=1;i<n;i++)
	{
		int u=read(),v=read();
		insert(u,v);
	}
	dp(1,0);
	int ans=inf;
	for(int i=1;i<=20;i++)
		ans=min(ans,f[1][i]);
	printf("%d\n",ans);
	return 0;
}

小结:多做一些结论题吧... ...

原文地址:https://www.cnblogs.com/ShuraK/p/9348447.html

时间: 2024-07-31 08:45:42

[bzoj1369][Baltic2003]Gem_树形dp_结论题的相关文章

树形dp 结论题 bzoj5024 [Jsoi2010]游戏

http://www.lydsy.com/JudgeOnline/problem.php?id=5024 首先吐槽一下题面是有错误的 那一个"或" 应该改成"," 这道题目条件是非常绕的 先看一个简化的问题 我们对于\(u\), \(v\) 如果\(u-v\)是良的 那么染成白色 否则染成黑色 问题转化成一个经典问题 给定一个完全图 求同色三角形的个数 做法就是考虑非同色三角形的个数 找角的个数\(jiao\) 答案就是\(C_n ^ 3 - jiao / 2\)

[bzoj2443][Usaco2011 Open]奇数度数_树形dp_生成树_并查集

奇数度数 bzoj-2443 Usaco-2011 Open 题目大意:给定一个n个点m条便有向图,问是否有一种选出一些边的方式使得所有点的度数都是奇数. 注释:$1\le n \le 5\cdot 10^4$,$1\le m\le 10^5$. 想法: 结论题:对于一个联通块来讲,如果求出它的生成树.只考虑生成树上的边的选取情况是否可能即是这个联通块的答案. 证明:如果存在一种,选取生成树以外的边满足题意,我们可以将这条边覆盖的树边全部取反,将该边舍去,仍然满足题意. 故此,用并查集求出生成树

【bzoj2079】[Poi2010]Guilds 构造结论题

题目描述 Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处.这里有n个城市,其中有一些以双向马路相连,这两个工会要求每个城市应该做到: 1:有这个工会的办事处或 2:和另外一个符合1条件的城市有马路直接相连.(也就是每个城市必须是YYD的公会,但是又和FSR的公会的城市相连,或者是FSR的,和YYD的城市相连,或者和两个工会的城市相连)但是Zy怀疑不正当的竞争,他担心一个城市有两个工会的办事处,(就是说一个城市不能有两个

[bzoj1369] [Baltic2003]Gem

结论题...一棵树里用到的颜色数不超过logn.. f[i][j]表示以i为根的子树里,i的颜色是j的方案数. g[i][j]表示max{f[i][k]},(k!=j 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=10233,inf=1e9+233; 7 stru

[codevs5578][咸鱼]tarjan/结论题

5578 咸鱼 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 在广袤的正方形土地上有n条水平的河流和m条垂直的河流,发达的咸鱼家族在m*n个河流交叉点都建立了城市.然而,由于河流有单一的流向,而咸鱼们却没有发达的下体,所以只能顺流而下.两两河流之间的流向互不影响. 现在,咸鱼冒险家Sorey决定出发去看看这个世界,但是Sorey担心自己可能被困在某个城市而无法回归自己的家乡.于是Sorey夜观天象,搞清楚了每条河的流向,他想请你帮他判断他的旅途是否会顺利.

【BZOJ4378】[POI2015]Logistyka【树状数组】【结论题】

[题目链接] 题解: 首先得有一个结论:设个数大于s的数字有k个(如果k大于c,显然是TAK.这里讨论k <= c),那么如果个数小于s的数字和不小于(c - k) * s,那么一定有解. 并不会证明... 用树状数组记录一下数字的个数以及数字的数字和,然后判断就可以了. 复杂度: 时间复杂度:O(mlogm),空间复杂度:O(m). 1A. GET: 结论题... /* Telekinetic Forest Guard */ #include <cstdio> #include <

沙雕打表结论题

没有链接 描述: 给p,q,求a^2+b^2 = p*q解的个数,p,q是素数 沙雕打表结论题 然后怼了3h吼爆零 题解 首先这是个结论题 然后这是证明 代码 #include <stdio.h> #include <algorithm> using namespace std; int p , q; int ans; void work () { scanf ( "%d%d" , &p , &q ); if ( p > q ) swap

codeforces 1269D. Domino for Young (二分图证明/结论题)

链接:https://codeforces.com/contest/1269/problem/D 题意:给一个不规则的网格,在上面放置多米诺骨牌,多米诺骨牌长度要么是1x2,要么是2x1大小,问最多放置多米诺骨牌的数量. 思路:首先这是一个结论题,对每个方格进行染色,一个方格染黑色,周围邻近的就染白色,答案就是黑色方格数量和白色方格数量的最小值.这个结论可以用二分图进行证明:把问题抽象成最大二分图匹配,每两个点之间连一条边.一个格子和周围格子连一条边,如果一个格子周围的还没被匹配,那么匹配数+1

【BZOJ-1369】Gem 树形DP

1369: [Baltic2003]Gem Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 282  Solved: 180[Submit][Status][Discuss] Description 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小. Input 先给出一个数字N,代表树上有N个点,N<=10000 下面N-1行,代表两个点相连 Out