您的位置:首页 > 编程语言 > Go语言

Poj 3107 Godfather (树的重心)

2014-08-01 18:10 375 查看
题意:给定一棵树,求树的所有重心,按照编号从小到大的顺序输出.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

const int N=50005;

struct Edge
{
	int from,to,next;
}edge[N<<1];

int head
,e,dp
; //所有子树中节点数的最大值,不含自身
int n,son
; //以每个节点为根的子树的节点数,包含自身
int ans
;

void Add (int u,int v)
{
	Edge E = {u, v, head[u]};
	edge[e] = E;
	head[u] = e++;
}

void DFS (int u, int pre)
{
	son[u]=1;
	dp[u]=0;
	for (int i=head[u]; ~i; i=edge[i].next)
	{
		int v=edge[i].to;
		if (v==pre) continue;
		DFS(v,u);
		son[u]+=son[v];
		dp[u]=max(dp[u],son[v]);
	}
	dp[u]=max(dp[u],n-son[u]);
}

int main ()
{
	while (~scanf("%d",&n))
	{
		memset(head,-1,sizeof(head));
		e=0;
		int i;
		for (i=1;i<n;i++)
		{
			int u,v;
			scanf("%d%d",&u,&v);
			Add(u,v);
			Add(v,u);
		}
		DFS(1,-1);
		int minnum=N,cnt=0;
		for (i=1;i<=n;i++)
			if (minnum > dp[i])
			{
				cnt=0;
				minnum=dp[i];
				ans[cnt++]=i;
			}
			else if (minnum==dp[i])
				ans[cnt++]=i;
		for (i=0;i<cnt;i++)
			printf(i==cnt-1?"%d\n":"%d ",ans[i]);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: