AcWing 846. 树的重心
原题链接
简单
树与图的深度优先搜索DFS
#include<bits/stdc++.h>
using namespace std;
const int N = 100010, M = N * 2;
int n;
int h[N];//表示第i个节点的第一条边的idx
int e[M];//表示第idx条边的终点
int ne[M];//表示与第idx条边同起点的下一条边的idx
int idx;
bool st[N];
int ans = N;
void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
//以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])
{
int s = dfs(j);
res = max(res, s);
sum += s;
}
}
res = max(res, n-sum);
ans = min(ans, res);
return sum;
}
int main()
{
cin>>n;
memset(h,-1,sizeof h);
//n-1条边
for(int i=0; i<n-1; i++)
{
int x, y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1);
cout<<ans<<endl;
return 0;
}