- 题目详情
- 代码打卡
题目详情 代码打卡
#include
#include
using namespace std;
const int N =1e5+10;
int h[N],e[2*N],ne[2*N],idx;
bool st[N];
int n,ans=N;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u)
{
st[u]=true;
int sum=0,size=0; //size表示当前子树最大数量
for(int i=h[u];i!=-1;i=ne[i]) // 遍历每一个可以到的点
{
int j=e[i];
if(st[j]) continue;
int s=dfs(j); //每一个子树的大小
size=max(size,s);
sum +=s;
}
size=max(size,n-sum-1); //出了当前这个节点所有点的数量
ans=min(ans,size);
return sum+1; //sum要加一的原因是要计算当前这个点
}
int main()
{
memset(h,-1,sizeof h);
cin >>n;
for(int i=1;i<=n;i++)
{
int a,b;
cin >> a>>b;
add(a,b),add(b,a);
}
dfs(1);
cout << ans;
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)