码迷,mamicode.com
首页 > 其他好文 > 详细

Godfather(POJ3107)——求树的重心(递归)

时间:2017-10-30 19:51:50      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:最大值   cpp   ref   cst   blog   poj   name   stream   for   

先贴上原题的链接

??

题目大意是给定一个无根树,使得去掉一个点之后,剩下子树的节点数的最大值最小,也就是求树的重心。求树的重心的话,只需要设一个点为跟,然后递归下去,求出son[i](表示以i为根节点的子树的节点数量)以及除了以此节点为根节点的子树的剩下的节点数,用f数组来表示。然后让max(f[pos],son[posson],(posson为pos的子节点)最小的节点输出就可以了。以下是程序

#include<iostream>
#include<cstdio>
using namespace std;
struct nob{
	int sta,ed,jump;
}a[100005];
int n,jump[50005],tot,son[50005],f[50005],mina=1e9;
void add(int sta,int ed) {
	tot++;
	a[tot].ed=ed;
	a[tot].jump=jump[sta];
	jump[sta]=tot;
}
void dfs(int pos,int fa){
	son[pos]=1;
	for (int i=jump[pos]; i; i=a[i].jump){
		if (a[i].ed==fa) continue;
		dfs(a[i].ed,pos);
		son[pos]+=son[a[i].ed];
	}
	f[pos]=n-son[pos];
	for (int i=jump[pos]; i; i=a[i].jump){
		if (a[i].ed==fa) continue;
		f[pos]=max(f[pos],son[a[i].ed]);
	}
	mina=min(f[pos],mina);
}
int main(){
	scanf("%d",&n);
	for (int i=1,x,y; i<n; i++){
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs(1,0);
	for (int i=1; i<=n; i++)
		if (f[i]==mina) printf("%d ",i);
	return 0;
}

Godfather(POJ3107)——求树的重心(递归)

标签:最大值   cpp   ref   cst   blog   poj   name   stream   for   

原文地址:http://www.cnblogs.com/cain-/p/7755146.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!