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;	
}


poj1655 Balancing Act(树形dp)

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

【POJ 1655】Balancing Act 【树的重心】

【POJ 1655】Balancing Act 求树的重心模板~
  • Regina8023
  • Regina8023
  • 2014年12月16日 16:03
  • 1031

POJ 1655 Balancing Act 树形dp

题意:一棵树,定义每个节点的balance值:去掉这点节点后的森林里所有树的最大节点数。求出最小的balance值和其所对应的节点编号。 对于删除的每一个点,计算下它的每颗子树的节点数与剩余的子树的...
  • Runner__
  • Runner__
  • 2016年05月28日 08:47
  • 205

poj 1655 Balancing Act(树形dp)

本文出自   http://blog.csdn.net/shuangde800 --------------------------------------------------------...
  • shuangde800
  • shuangde800
  • 2013年08月31日 21:32
  • 1287

poj 1655 Balancing Act(树形DP)

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

POJ 1655 - Balancing Act 树形DP

这题和POJ 3107 - Godfather异曲同工...http://blog.csdn.net/kk303/article/details/9387251   Program: #include...
  • kk303
  • kk303
  • 2013年07月20日 09:18
  • 629

POJ 1655 Balancing Act(树形DP)

思路:和POJ3107几乎一样...忘记把ans归0了 WA一次... #include #include #include #include #include #include ...
  • qq_21057881
  • qq_21057881
  • 2016年04月04日 19:36
  • 228

Balancing Act - POJ 1655 树形dp

Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9048   ...
  • u014733623
  • u014733623
  • 2014年10月04日 15:47
  • 400

poj 1655 Balancing Act(树形DP)

Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11534   ...
  • clover_hxy
  • clover_hxy
  • 2016年04月27日 21:19
  • 375

POJ 1655 - Balancing Act(树形DP)

题目: 点击打开链接 题意: 求出一棵树中,去除一个节点后,得到的各子树的节点数中最大的最小值。 AC. #include #include #include #include ...
  • u013534690
  • u013534690
  • 2015年08月26日 16:14
  • 303
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1655 Balancing Act 树形dp
举报原因:
原因补充:

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