#include <iostream>
using namespace std;
const int N = 100010;
const int M = N * 2;
int Head[N];
int Next[M];
int Value[M];
bool IsVisit[N];
int Index;
int Ans = N;
int n;
void Add(int a, int b)
{
Value[Index] = b;
Next[Index] = Head[a];
Head[a] = Index;
Index++;
}
//返回以当前节点为根的 节点个数
int Dfs(int Root)
{
IsVisit[Root] = true;
//Sum就是当前节点为根的节点个数 包括它本身
//Res 是记录当前节点的每个子树节点个数的最大值
int Sum = 1, Res = 0;
//
for(int i = Head[Root]; i != -1; i = Next[i])
{
int j = Value[i];//j是和根节点有边的节点
//如果没有被访问过
if(!IsVisit[j])
{
int s = Dfs(j);//S每次都是获取子树的节点数
Res = max(Res,s);
Sum += s;
}
}
//删除当前节点以及其子树 剩下的节点个数
Res = max(Res,n-Sum);
Ans = min(Res,Ans);
return Sum;
}
int main(int argc, char** argv)
{
fill(Head,Head+N,-1);
cin>>n;
for(int i = 0; i < n-1; i++)
{
int a,b;
cin>>a>>b;
Add(a,b);
Add(b,a);
}
Dfs(1);
cout<<Ans<<endl;
return 0;
}
Dfs实现树的重心
最新推荐文章于 2024-06-22 22:48:34 发布
该篇博客展示了如何使用C++实现深度优先搜索(DFS),通过遍历树结构计算以任意节点为根的节点个数,并找到节点个数最大的子树。代码中详细介绍了添加边的操作和Dfs函数的递归调用,最终输出答案。
1004

被折叠的 条评论
为什么被折叠?



