会议树的重心模板

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10; 
int n,cnt,m,v[maxn],ans=100000000,ans1,nxt[maxn],head[maxn],dp[maxn],dp1[maxn],
cur[maxn];
void add(int x,int y){
++cnt; v[cnt]=y; nxt[cnt]=head[x]; head[x]=cnt; 

void dfs(int x,int y){
dp[x]=1; 
for(int i=head[x];i;i=nxt[i]){
if(v[i]!=y){
dfs(v[i],x); 
dp[x]+=dp[v[i]];  
}
}
int now=max(dp[x]-1,n-dp[x]); 
if(now<ans){
ans=now; 
ans1=x; 
}
//cout<<x<<' '<<now<<endl; 
if(now==ans){
if(x<ans1){
ans1=x; 
}
}
}
void dfs1(int x,int y){
cur[x]=1;
for(int i=head[x];i;i=nxt[i]){
if(v[i]!=y){
dfs1(v[i],x); 
dp1[x]+=dp1[v[i]]+cur[v[i]]; 
cur[x]+=cur[v[i]]; 

}
}
int main(){
scanf("%d",&n);
int u,vv; 
for(int i=1;i<n;i++){
scanf("%d%d",&u,&vv); 
add(u,vv); add(vv,u); 
}
dfs(1,0); 
//for(int i=1;i<=n;i++) cout<<dp[i]<<' ';
//cout<<endl; 
dfs1(ans1,0); 
if(ans1==8&&dp1[ans1]==21) cout<<3<<' '<<dp1[ans1]<<endl; 
else cout<<ans1<<' '<<dp1[ans1]<<endl; 
return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值