POJ 1655 Balancing Act 树形dp

原创 2012年03月27日 21:38:12

http://poj.org/problem?id=1655

题意:一颗有N个结点的树, 每个结点的平衡度定义为:从树中去掉该结点之后形成的森林中结点最多的树的结点数 ,求平衡度最小的结点。如果有两个结点的平衡度相同,则输出编号较小的那个。

思路: 树形dp。 确定树的一个根结点,对于某个结点,首先用dp[i]表示以该结点为根节点的子树中结点的个数,在该结点的所有孩子的子树中的结点的个数由叶->根的顺序求出来之后,就可以确定该结点的平衡度了,balance[i] =  max ( max(dp[j]) , N-sum(dp[j])-1 ),每个结点的平衡度都求出来之后,就可以找出最小的那个了。 这里还有一个问题需要注意,给定的树并没有给定具体的根和两个结点之间的父亲-孩子关系,只是单纯地给定了两个点之间的值。在找树的根的时候我们可以任意找一个结点开始(假设1),然后用dfs记录与每个结点相连的结点的关系(父亲or孩子),这样一颗树就建立起来了。

代码:

#include<stdio.h>
#include<string.h>
#include<vector>
#define MAX(a,b) a > b ? a : b ;
#define MAXN 20010
using namespace std;
int Tc ,N ;
vector<int> G[MAXN] ;
int f[MAXN] ;
int balance[MAXN] ;

inline void Init(){
	for(int i=1;i<=N;i++){
		G[i].clear() ;
		f[i] = -1 ;
	}	
} 
void build(int u){			//建树
	for(int i=0;i<G[u].size();i++){
		int v = G[u][i] ;	
		if(v == f[u])	continue ;
		f[v] = u ;
		build(v) ;
	}
}
int dfs(int u){
	int _max = 0 ,sum = 0 ;
	for(int i=0;i<G[u].size();i++){
		int v = G[u][i] ;
		if(v == f[u])	continue ;
		int res1 = dfs(v);
		sum += res1 ;
		_max = MAX(_max , res1 );	
	}	
	_max = MAX(_max ,N-sum-1);
	balance[u] = _max ;
	return sum + 1 ;
}
int main(){
	int a ,b ;
	scanf("%d",&Tc);
	while(Tc--){
		scanf("%d",&N);
		Init();
		for(int i=1;i<N;i++){
			scanf("%d %d",&a,&b);	
			G[a].push_back(b) ;
			G[b].push_back(a) ;
		}
		build(1) ;
		dfs(1);
		int _min = MAXN ,min_n;
		for(int i=1;i<=N;i++){
			if(_min > balance[i]){
				_min = balance[i] ;
				min_n = i ;	
			}
		}
		printf("%d %d\n",min_n ,_min);
	}
	return 0;	
}


相关文章推荐

poj 1655 Balancing Act(树形DP)

题意:求树上的一个点,删除该点后形成的众多树中,最大的树的大小最小。换句话说就是求树的重心。 思路:DP+DFS 定义状态:dp[a]表示 以a 为根节点的子树大小 然后一遍DPS,每次判断a的...

POJ 1655 Balancing Act (树形dp 树的重心)

POJ 1655 Balancing Act (树形dp 树的重心)

POJ1655Balancing Act(树形DP)

Description Consider a tree T with N (1

poj1655 Balancing Act 【树形DP(很弱)】

都不知道怎么分类了。 大概要求一个树中以某个结点为根的子树结点个数,还有儿子结点中以儿子结点为根的子树结点个数的最大值,用递归得到n[i],以i为根节点的子树结点个数 #include #inc...

poj1655 Balancing Act(树形dp)

Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11176   ...
  • d_x_d
  • d_x_d
  • 2015年11月27日 12:16
  • 858

POJ1655:Balancing Act(树形DP)

Description Consider a tree T with N (1

poj1655 Balancing Act(树形dp)

正如标题一样树形dp?感觉就想是搜索题。 题目意思:题目要我们求某个点:以这个点为根结点的子树中顶点个数的最大值作为这个点的价值,那么找出价值最小的点,并且输出最小值,价值相等输出靠前的点。 搜索有一...

简单树形dp-poj-1655-Balancing Act

题目链接: http://poj.org/problem?id=1655 题目意思: 给一棵树,求去掉一个节点,形成的多棵树中节点数的最大值最小。 解题思路: 简单树形dp. dp[i...

poj 1655Balancing Act(找重心,树形dp)

Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10375   ...

poj1655(Balancing Act + 树形dfs)

题目链接:http://poj.org/problem?id=1655      题意:有一颗N个节点的树,每个节点的Balancing是删除该节点后所有子树中节点数目最大的子树节点数目。问Bala...
  • kath_y
  • kath_y
  • 2012年08月22日 10:57
  • 484
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1655 Balancing Act 树形dp
举报原因:
原因补充:

(最多只允许输入30个字)