AcWing 846. 树的重心(dfs)

这是一道我一开始没怎么看懂的题目,然后后面看了y神的讲解就豁然开朗了

不过我们首先要有先置知识来理解这道题目

先置知识

邻接表:是一种表示图的数据结构,它通过链表的方式记录每个顶点及其相邻的顶点。在这个具体的问题中,使用数组 h 来表示邻接表。

  • h 数组:h 数组的每个元素 h[i] 是一个链表的头指针,指向以节点 i 为起点的链表的第一个元素。链表中的每个节点表示节点 i 可以直接连接的其他节点。
int h[N];
Arrays.fill(h, -1);

这段代码初始化了 h 数组,将每个顶点的链表头指针初始化为 -1,表示初始时每个顶点没有相邻的节点。

数组建立邻接表

int h[N], e[N * 2], ne[N * 2], idx;  // 数组范围要得是两倍才行
public static void add(int a, int b) {e[idx] = b;      // 将节点b添加到节点a的邻接表中ne[idx] = h[a];   // 更新节点a的邻接表头,将当前边的下一个节点设置为原来的邻接表头h[a] = idx++;     // 更新节点a的邻接表头为当前边的索引,并将索引自增
}
  • e 数组存储了图中边的终点,ne 数组存储了下一条边的索引,h 数组存储了每个节点的邻接表头。
  • idx 是一个全局变量,用于表示当前边的索引。
  • 在函数内部,首先将节点b添加到节点a的邻接表中(表示a指向b)。
  • 然后,更新节点a的邻接表头,将当前边的下一个节点设置为原来的邻接表头。
  • 最后,更新节点a的邻接表头为当前边的索引,并将索引自增,确保每次添加边都使用新的索引。

树的bfs模板

// 需要标记数组st[N],  遍历节点的每个相邻的便
void dfs(int u) {st[u] = true; // 标记一下,记录为已经被搜索过了,下面进行搜索过程for (int i = h[u]; i != -1; i = ne[i]) {int j = e[i];if (!st[j]) {dfs(j);}}
}

题目

给定一颗树,树中包含n个结点(编号 1∼n)和 n−1 条无向边。

请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

输入格式

第一行包含整数 n,表示树的结点数。

接下来 n−1 行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。

输出格式

输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。

数据范围

1≤n≤105

输入样例
9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6
输出样例:
4

代码与解析

import java.util.Arrays;
import java.util.Scanner;public class Main {static final int N = 100010, M = N * 2;static int n;static int[] h = new int[N], e = new int[M], ne = new int[M];static int idx;static int ans = N;static boolean[] st = new boolean[N];public static void add(int a, int b) {e[idx] = b;ne[idx] = h[a];h[a] = idx++;}// 深度优先搜索,返回以u为根的子树的节点数public static int dfs(int u) {st[u] = true;  // 标记节点u已经被访问int size = 0, sum = 0;  // size记录u的最大子树节点数,sum记录u统领的所有子节点数for (int i = h[u]; i != -1; i = ne[i]) {  // 遍历节点u的所有邻接节点int j = e[i];  // j为u的邻接节点if (st[j]) {  // 如果j已经被访问过,继续下一个邻接节点continue;}int s = dfs(j);  // 递归调用dfs,计算以j为根的子树的节点数size = Math.max(size, s);  // 更新u的最大子树节点数sum += s;  // 累加u统领的所有子节点数}size = Math.max(size, n - sum - 1);  // 计算删除u后,剩余各个连通块中节点数的最大值ans = Math.min(size, ans);  // 更新全局最小值return sum + 1;  // 返回u节点+所有u节点统领的节点的综合}public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();  // 读取树的总节点数Arrays.fill(h, -1);  // 初始化每个节点的链表为空for (int i = 1; i < n; i++) {int a = sc.nextInt();int b = sc.nextInt();add(a, b);  // 添加一条从a到b的边add(b, a);  // 添加一条从b到a的边}dfs(1);  // 从节点1开始深度优先搜索System.out.println(ans);  // 输出最终结果}
}

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

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

相关文章

RAG代码实操之斗气强者萧炎

&#x1f4d1;前言 本文主要是【RAG】——RAG代码实操的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#x…

Netty 介绍、使用场景及案例

Netty 介绍、使用场景及案例 1、Netty 介绍 https://github.com/netty/netty Netty是一个高性能、异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可扩展的网络服务器和客户端。它是一个开源项目&#xff0c;最初由JBoss公司开发&#xff0c;现在由社区维护。Netty的…

企业网络出口部署案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

行分类问题

行分类问题可以应用于多个领域和问题&#xff0c;其中一些示例包括&#xff1a; 文本分类&#xff1a; 在自然语言处理中&#xff0c;可以将文本分为不同的类别&#xff0c;例如情感分析、主题分类等。每个文本可以被视为一个“行”&#xff0c;而分类任务就是对每个行进行分类…

myql进阶-一条查询sql在mysql的执行过程

目录 1. 流程图 2. 各个过程 2.1 连接器 2.2 分析器 2.3 优化器 2.4 执行器 2.5 注意点 1. 流程图 2. 各个过程 假设我们执行一条sql语句如下&#xff1a; select * from t_good where good_id 1 2.1 连接器 首先我们会和mysql建立连接&#xff0c;此时就会执行到连接…

C++20结构化绑定应用实例(二百五十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Neonode触摸传感器模块之I2C鼠标和键盘

引言 触摸传感器模块可用于通过I2C向计算机发送键盘或鼠标输入。Arduino Library示例zForceKeyboardMouse中包含了如何实现这一点的示例。该示例使用官方的Arduino库&#xff1c;Mouse.h&#xff1e;和&#xff1c;Keyboard.h&#xff1e;与主机系统通信。 zForceKeyboardMous…

VR转接器:打破界限,畅享虚拟现实

你是否曾梦想过踏入另一个世界&#xff0c;体验那种仿佛置身其中的感觉&#xff1f;随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;已经成为了现实。而VR转接器&#xff0c;正是让你畅享虚拟现实的关键所在。 添加图片注释&#xff0c;不超过 140 字&…

猫头虎分享:探索TypeScript的世界 — TS基础入门 ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

Web前端 ---- 【Vue3】vue3中的组件传值(props、自定义事件、全局事件总线)

目录 前言 props 自定义事件 全局事件总线 安装第三方库mitt 封装event-bus.js文件 使用全局事件总线 清除全局事件绑定 前言 本文介绍在vue3中的组件传值&#xff0c;props、自定义事件以及全局事件总线。相较于vue2中&#xff0c;略有变化。关于vue2中的组件传值看这篇…

vscode运行Python的两种方法,及无法运行的原因

vscode运行Python代码 下面介绍的vscode运行Python代码的方法基于的一个前提条件是&#xff1a;当前的计算机已经安装好了Python&#xff0c;且已经配置好了相关的环境变量。如果要查看是否已经都安装好了&#xff0c;可以打开Windows系统的命令行工具Windows PowerShell&…

鸿蒙(HarmonyOS)应用开发指南

1. 概述 1.1 简介 鸿蒙&#xff08;即 HarmonyOS &#xff0c;开发代号 Ark&#xff0c;正式名称为华为终端鸿蒙智能设备操作系统软件&#xff09;是华为公司自 2012 年以来开发的一款可支持鸿蒙原生应用和兼容 AOSP 应用的分布式操作系统。该系统利用“分布式”技术将手机、电…

vue、element-ui使用el-tooltip判断文本是否溢出

1.需求&#xff1a;需要实现文本单行显示&#xff0c;超出时&#xff0c;使用省略号&#xff0c;划过该文本时使用tooltip显示全部文本。需要考虑数据是由接口动态获取&#xff0c;只有溢出文本鼠标滑过时显示全部文本&#xff0c;没有溢出的则不需要。 2.实现&#xff1a; 第…

img标签的奇怪问题

本来只是为实现一个轮播图&#xff0c;img的url地址是从后端接口获取的&#xff0c;但不巧的是url地址的图片都过期了。 因为懒得重新到网上找图&#xff0c;就想直接用一下本地的图片&#xff0c;简单的想法遇到一堆问题。 问题一&#xff1a; 因为是springboot项目&#xf…

windows11通过虚拟机安装Ubuntu20.04

VMware 分为 VMware Workstation Pro 和 VMware Workstation Player, Pro体验期后收费&#xff0c;Player则免费。player 早期不能创建虚拟机&#xff0c;只能Pro创建好后给Player运行&#xff0c;而现在player早已加入创建虚拟机功能&#xff0c;所以使用体验上两者相差不大&a…

物联网协议Coap之Core和NetWork简介

目录 前言 一、Coap的Core包 1、Coap对象 2、Message对象 3、Request对象 4、Response对象 二、Coap的NetWork调试 1、UDP运行模式 2、Network消息接收 3、Sender线程发送数据 三、总结 前言 在之前的博文中&#xff0c;对Californium中Coap的实现进行了简要的介绍&a…

swing快速入门(四十)JList、JComboBox实现列表框

注释很详细&#xff0c;直接上代码 上一篇 新增内容 &#x1f9e7;1.列表的属性设置与选项监听器 &#x1f9e7;2.下拉框的属性设置与选项监听器 &#x1f9e7;3.Box中组件填充情况不符合预期的处理方法 &#x1f9e7;4.LIst向Vector的转化方法 源码&#xff1a; package swing…

OpenCV 基于C++图像读取及存储API函数

OpenCV可以从存储介质中读入图像&#xff0c;也可以将摄像头(Camera)抓取的图像载入内存&#xff0c;然后进行处理。而存储图像就是将内存中的图像数据写入存储介质中&#xff0c;如写入硬盘、优盘等。 OpenCV要读入图像、操作图像。首先要用到Mat类&#xff0c;并且需创建Mat对…

mysql 获取距离某点最近的数据

方式一 算法&#xff1a;st_distance (POINT ( latitude, longitude ),POINT ( 106.695823, 26.574557 )) * 111195 SELECT*,st_distance (POINT ( latitude, longitude ),POINT ( 106.695823, 26.574557 )) * 111195 AS distance FROMtest_distance ORDER BYdistance DESC…

理想汽车迎来新算力平台负责人,内部化名为张一粟;王者荣耀在抖音直播全面开放;陈楚生等人现身央视春晚彩排

今日精选 • 理想汽车迎来新算力平台负责人,内部化名为张一粟。目前理想内部暂未公布其内部职级• 王者荣耀在抖音直播全面开放• 陈楚生等人现身央视春晚彩排 投融资 • 2023年12月份&#xff0c;中国社会融资规模增量为1.94万亿元• OpenAI 支持的人形机器人公司 1X 完成 …