POJ3107 树的重心

题解:只不过如果有求多个点,输出所有方案。

 1 #include<cstring>
 2 #include<cmath>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cstdio>
 6 #include<vector>
 7 #define N 50007
 8 #define inf 1000000009
 9 using namespace std;
10 
11 int n,id,mnum;
12 int siz[N];
13 int cnt,head[N],next[N*2],rea[N*2];
14 vector<int>q;
15 
16 void add(int u,int v)
17 {
18     next[++cnt]=head[u];
19     head[u]=cnt;
20     rea[cnt]=v;
21 }
22 void dfs(int u,int fa)
23 {
24     int sum=0,msiz=-1;
25     siz[u]=1;
26     for (int i=head[u];i!=-1;i=next[i])
27     {
28         int v=rea[i];
29         if (v==fa) continue;
30         dfs(v,u);
31         siz[u]+=siz[v];
32         msiz=max(msiz,siz[v]);
33     }
34     msiz=max(msiz,n-siz[u]);
35     if (msiz==mnum) q.push_back(u);
36     else
37     if (msiz<mnum)
38     {
39         mnum=msiz;
40         q.clear();
41         q.push_back(u);
42     }
43 }
44 int main()
45 {
46     scanf("%d",&n);
47     memset(head,-1,sizeof(head));
48     memset(siz,0,sizeof(siz));
49     for (int i=1,x,y;i<n;i++)
50     {
51         scanf("%d%d",&x,&y);
52         add(x,y),add(y,x);
53     }
54     mnum=inf;
55     dfs(1,-1);
56     sort(q.begin(),q.end());
57     for (int i=0;i<q.size();i++)
58         printf("%d ",q[i]);
59 }

 

转载于:https://www.cnblogs.com/fengzhiyuan/p/7766442.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值