poj3107树的重心

/*
树的重心求法:两次dfs,第一次dfs处理出每个结点的size,以此求每个结点大儿子的size,第二次dfs将每个结点大儿子的size和余下结点数进行比较,所有结点里两个值之间差值最小的那个点就是重心
*/
#include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<algorithm> using namespace std; #define maxn 50005 struct Edge{int to,nxt;}edge[maxn<<1]; int Max,head[maxn],tot,n,size[maxn],maxv[maxn]; vector<int>vec; void init(){ memset(maxv,0,sizeof maxv); memset(head,-1,sizeof head); tot=0;Max=99999999; } void addedge(int u,int v){ edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++; } void dfssize(int u,int pre){ size[u]=1;maxv[u]=0; for(int i=head[u];i!=-1;i=edge[i].nxt){ int v=edge[i].to; if(v==pre)continue; dfssize(v,u); size[u]+=size[v]; if(size[v]>maxv[u])maxv[u]=size[v]; } } void dfsroot(int u,int pre){ if(n-size[u]>maxv[u]) maxv[u]=n-size[u]; if(maxv[u]<Max) Max=maxv[u]; for(int i=head[u];i!=-1;i=edge[i].nxt){ int v=edge[i].to; if(v!=pre)dfsroot(v,u); } } int main(){ while(scanf("%d",&n)!=EOF){ init(); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); } dfssize(1,0);//一次dfs求所有节点size dfsroot(1,0); for(int i=1;i<=n;i++)if(maxv[i]==Max)printf("%d ",i); puts(""); } }

 

转载于:https://www.cnblogs.com/zsben991126/p/10343895.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值