Dfs实现树的重心

该篇博客展示了如何使用C++实现深度优先搜索(DFS),通过遍历树结构计算以任意节点为根的节点个数,并找到节点个数最大的子树。代码中详细介绍了添加边的操作和Dfs函数的递归调用,最终输出答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值