Poj 3107 Godfather (树的重心)

来源:互联网 发布:手机qq网络硬盘 编辑:程序博客网 时间:2024/05/16 13:04

题意:给定一棵树,求树的所有重心,按照编号从小到大的顺序输出.

#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[N],e,dp[N]; //所有子树中节点数的最大值,不含自身int n,son[N]; //以每个节点为根的子树的节点数,包含自身int ans[N];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;}


0 0
原创粉丝点击