树的重心-DFS

 题目

大体思路

用邻接表来存树,用dfs进行遍历.

具体实现

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h> 
using namespace std;
const int N = 100005 ,M = 2 * N;
int ans = N,idx,n;
int h[N],e[M],ne[M]; //用邻接表存储树 
bool st[N];
void add(int a,int b){ // a -> c  
	//idx 永远指向一个空的位置
	//所以可以拿过来直接用 
	e[idx] = b;         //  a-> b -> c
	ne[idx] = h[a];
	h[a] = idx++;
}
int dfs(int u){
		int son_max = 0,sum = 0;
		for(int i=h[u];i!=-1;i=ne[i]){ //这里面除了有它的子节点之外,其实还有其父节点,因为是无向图.
			                           //而其父节点和子节点的区别就是,父节点被访问过了,因为只能通过父节点
			                           //找到子节点,而子节点还未被访问过.
			int j = e[i],t; // i 第几个插入的点
			              // j 才是树节点的编号 
			if(!st[j]){
				st[j] = 1;
				t = dfs(j);
 			}
			else{ //else这一句是啥意思??? 
			 	continue;
			}

			son_max = max(t,son_max);
			sum += t;
		}
		son_max = max(son_max,n - sum - 1); //求出连通块中的最大值 
		ans = min(ans,son_max); //找最大值中的最小值 
		                        // 别忘了给ans一开始赋一个最大值 
		return sum + 1; //这里很重要 
}
int main(){
	scanf("%d",&n);
	int a,b;
	memset(h,-1,sizeof h); //在string.h中 
	for(int i=0;i<n -1;i++){
		scanf("%d%d",&a,&b);
		add(a,b);
		add(b,a);
	}
	dfs(1);
	printf("%d\n",ans); 
	
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣淘淘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值