无向图-树的重心-DFS求解

思路:

本题的本质是树的dfs, 每次dfs可以确定以u为重心的最大连通块的节点数,并且更新一下ans。

也就是说,dfs并不直接返回答案,而是在每次更新中迭代一次答案。

这样的套路会经常用到,在 树的dfs 题目中

总结以u为根的子树个数可由dfs(j)不断递归得到

 由于本题给出的图是无向图,假如首次遍历,不论取那个节点,它都会把与他联通的所有子树全部加入sum,最终sum都==n。

例如从4开始遍历的话,上面一块和下面两块连通块数目都被计算过并被加到sum中。

循环结束后sum==n,没必要取res=max(res,n-sum)。

res=max(n-sum,res)对于首次遍历的节点来说是确实没必要的;但对后续的子节点dfs时由于其父节点已经遍历过了,for循环中就不能获取到以父节点为根的子树。

比如节点4,sum就只能取到节点4下面的两个子树节点数之和,取不到它的父节点,这种情况就需要max(n-sum,res),n-sum指的是去除下面的两个子树节点数,该树还剩下的节点数。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int e[N], h[N*2], ne[N*2], idx; //无向图最多开2 * N条边 bool st[N]; //用于记录每个结点是否被访问
int n;
int ans = N;
void insert(int a,int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
int dfs(int u)
{st[u] = true; //标记已经搜过了int sum = 1,res = 0;  //res记录以当前节点为重心所有连通块节点数的最大值 ,sum记录以当前点为根节点的子树节点数 ,初始值为1for (int i = h[u]; i != -1; i=ne[i])//for循环遍历每个树节点所有与之相连的节点{int k = e[i]; //获取结点if (!st[k])  //如果这个结点没有被搜过{int s = dfs(k); //深搜获取每个连通块结点个数res = max(res, s); sum += s;}}res = max(res, n - sum);ans = min(ans, res);return sum;
}
int main()
{cin >> n;memset(h, -1, sizeof h);int a, b;for(int i=1;i<n;i++){cin >> a >> b;insert(a, b);insert(b, a);}dfs(1);cout << ans << endl;
}

算法小白的学习笔记。

图片来源

Acwing846树的重心---------dfs(邻接表)

借鉴了其他大佬的思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/455358.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的内置函数-print()、input()、range()

内置函数 一、print()二、input()三、range()range的定义与特点range()函数的使用使用range()创建数字列表 一、print() print()是一个内置函数&#xff0c;用于将指定的内容打印到控制台。 #基本用法&#xff1a; print(value1, ..., sep , end\n, filesys.stdout, flushFal…

双向链表的插入、删除、按位置增删改查、栈和队列区别、什么是内存泄漏

2024年2月4日 1.请编程实现双向链表的头插&#xff0c;头删、尾插、尾删 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int datatype; enum{FALSE-1,SUCCSE}; typedef str…

npm淘宝镜像源换新地址

新的淘宝npm镜像源地址&#xff1a;https://registry.npmmirror.com 切换新的镜像源 npm config set registry https://registry.npmmirror.com然后再执行以下操作查看是否成功 npm config list如果没安装过淘宝镜像源的&#xff0c;则直接安装 npm install -g cnpm --regi…

Springboot 整合 Elasticsearch(二):使用HTTP请求来操作ES

&#x1f4c1;前情提要&#xff1a;Springboot整合Elasticsearch&#xff08;一&#xff09;&#xff1a;Linux下安装 Elasticsearch 8.x 上回说到&#xff0c;Elasticsearch 已经安装完成&#xff0c;不过我们使用7.17.5 版本继续后文&#xff1a; 一、使用 elasticsearch-hea…

【Java EE】----Spring框架创建和使用

1.Spring框架创建 创建一个maven项目 添加Spring框架支持 <dependencies> 上下文<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></depende…

技术债解决思考v2

1、在实际情况中可能得先理解技术是为业务服务的&#xff0c;具体可见&#xff1a;BRD MRD PRD的概念、关系、区别 - 知乎 (zhihu.com) 2、理解之后&#xff0c;再根据上述办法来解决技术债&#xff0c;其中说服人的办法可以有借鉴五步说服人法&#xff1a;如何用五步有逻辑地…

使用代理IP有风险吗?如何安全使用代理IP?

代理IP用途无处不在。它们允许您隐藏真实IP地址&#xff0c;从而实现匿名性和隐私保护。这对于保护个人信息、绕过地理受限的内容或访问特定网站都至关重要。 然而&#xff0c;正如任何技术工具一样&#xff0c;代理IP地址也伴随着潜在的风险和威胁。不法分子可能会滥用代理IP…

【发票识别】新增针对图片发票的识别(升级中)

说明 为了完善发票识别的功能&#xff0c;目前发票识别支持发票图片格式的识别&#xff0c;增加可用性。 体验 体验地址&#xff1a;https://invoice.behappyto.cn/invoice-service/ 体验地址上面有示例的发票&#xff0c;可以下载上传识别或者复制url地址进行识别。 技术栈…

【数据分享】1929-2023年全球站点的逐年平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐年平均气温数据、逐年最高气温数据…

【RT-DETR有效改进】轻量级下采样方法ContextGuided(参数量下降700W,轻量又涨点)

&#x1f451;欢迎大家订阅本专栏&#xff0c;一起学习RT-DETR&#x1f451; 一、本文介绍 本文给大家带来的是改进机制是一种替换Conv的模块Context Guided Block (CG block) &#xff0c;其是在CGNet论文中提出的一种模块&#xff0c;其基本原理是模拟人类视觉系统依赖上…

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来&#xff0c;汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

编译原理与技术(二)——词法分析(一)正则表达式

一、词法分析的概貌 一个程序&#xff0c;在我们看来往往是像下图这样的。 实际上&#xff0c;上面的程序本质上就是一个字符串&#xff0c;所以&#xff0c;它等价于下面这样的。 上面的字符串&#xff08;字符流&#xff09; &#xff0c;就是编译器接收到的程序的形式。 所…