AcWing 846. 樹的重心
阿新 • • 發佈:2020-08-01
AcWing 846. 樹的重心
#include <bits/stdc++.h> using namespace std; const int N=1e5+10,M=2*N; int n; int h[N],e[M],ne[M],idx; bool st[N]; //去掉重心的所有的子樹中最大的子樹的結點數目 int ans=N; void add(int a,int b){ e[idx]=b; ne[idx]=h[a]; h[a]=idx++; } //sum:以u為根的子樹中,點的數量 int dfs(int u){ st[u]=true; int sum=1,res=0; for(int i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(!st[j]){ //s:以j為根的當前子樹中,點的數量,類比sum int s=dfs(j); //res:刪掉j點後,當前所有連通塊中點數的最大值 res=max(res,s); //j是u的一部分 sum+=s; } } //res:刪掉u點後,當前所有連通塊中點數的最大值 res=max(res,n-sum); ans=min(res,ans); return sum; } int main(){ cin>>n; memset(h,-1,sizeof h); for(int i=0;i<n-1;i++){//n為點的個數,只能連n-1條邊 int a,b; cin>>a>>b; add(a,b),add(b,a); } dfs(1); cout<<ans<<endl; return 0; }