树的重心
题解代码
#include<iostream>
using namespace std;
const int maxn=1e5+10;
struct Edge
{
int from,to,nex;
}edge[maxn];
int cnt;
int head[maxn];
int father[maxn];
void add(int a,int b)
{
cnt++;
edge[cnt].nex=head[a];
edge[cnt].from=a;
edge[cnt].to=b;
head[a]=cnt;
}
int st[maxn];
int a[maxn];
int dfs(int u)
{
int ans = 0;
st[u] = 1;
for(int i=head[u];i;i=edge[i].nex)
{
int j = edge[i].to;
if(!st[j])ans += dfs(j);
}
return a[u] = ans+1;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n-1;i++)
{
int a,b;
cin>>a>>b;
add(a,b);
father[b]=a;
}
int i0=0;
for(int i=1;i<=n-1;i++)
{
if(father[i]==0)i0=i;
}
dfs(i0);
int minx=0x3f3f3f3f,mini;
for(int i=1;i<=n;i++)
{
int x=0;
if(i!=i0)
{
x=max(a[i0]-a[i],x);
}
for(int j=head[i];j;j=edge[j].nex)
{
x=max(x,a[edge[j].to]);
}
if(minx>x)
{
minx=x;
mini=i;
}
}
printf("%d",minx);
return 0;
}