AcWing 846. 树的重心

给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。

请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

#include<bits/stdc++.h>
#define N 1000000
using namespace std;
int head[N],t[N],net[N],cut;
void add(int from,int to){net[++cut]=head[from];head[from]=cut;t[cut]=to;}
int n,maxx=0x3f3f3f3f;
int tp[N],dep[N];
void dfs(int x,int fa)
{
    dep[x]=1;
    int kk=0;
    for(int i=head[x];i;i=net[i])
    {
        int y=t[i];
        if(y==fa)continue;
        dfs(y,x);
        kk=max(kk,dep[y]);
        dep[x]+=dep[y];
    }
    kk=max(n-dep[x],kk);
    maxx=min(maxx,kk);
}
int main()
{
    scanf("%d",&n);
    memset(tp,0,sizeof(tp));
    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs(1,0);
    printf("%d",maxx);
    return 0;
}

 

上一篇:AcWing 846. 树的重心


下一篇:P1080 [NOIP2012 提高组] 国王游戏