给定一颗树,树中包含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; }