图论--DFS搜索图/树
目录
一、图的存储结构
二、题目练习
846. 树的重心 - AcWing题
dfs,之前学习的回溯算法好多都是用dfs实现搜索的(把题目抽象成树形结构来搜索),其实 回溯算法就是 深搜,只不过针对某一搜索场景 我们给他一个更细分的定义,叫做回溯算法。
本节专门讲解dfs在图上的应用,需要做的就是① 明确图的存储结构(邻接矩阵、邻接表),② 背模版 ③ 刷题
一、图的存储结构
看这篇博文就OK
图的存储方式总结:如何高效表示顶点与边的关系?-CSDN博客
最复杂的写法也就是 vector<vector<pair<int, int>>> g ,虽然看起来复杂,但是比较好理解,这里我是跟着卡哥学习的写法,之前yxc大佬的数组写法呜呜呜我真的只能一时理解不能长久记忆,也写过相关博客笔记 ACWing【846】树的重心、图中点的层次 、邻接表存储图/树、dfs/bfs搜索图/树_图中点的层次acwing-CSDN博客
当时写完应该是明白的,但是现在看真的一头雾水。。。。。
二、题目练习
之前仔细学过的部分,这里温习一下就好啦,看这篇博客 ,里面有四道经典例题(那很经典了)深度优先搜索DFS-从入门到精通【卡玛】_
所有可达路径属于---模版题,搜索1--n的所有路径并输出
岛屿问题用来练习网格连通块识别问题
- 岛屿数量-----统计有多少个由“1”组成的互不连通区域,连通快计数问题
- 岛屿最大面积---找最大的连通块
- 沉默孤岛和孤岛总面积属于-------连通块/连通域标记题型
博客中有四道经典例题~回顾之后下面再练习几道新题
明确用什么存储图
图是有向边吗还是无向边? 会有重边吗?需要使用visited数组吗??搜索的时候注意边界?
树的重心问题 ,如何操作树结构(其实和图没什么不同)
846. 树的重心 - AcWing题库

树的重心问题,挺简单的一道题,主要是理解题意,什么是最大节点数最小???
这里我们使用 DFS 统计每个节点删除后各子树大小的最大值,然后取所有节点中这个“最大值”的最小值
思路:
1. 从根节点开始DFS 2. 递归计算每个节点的所有子树规模 3. 在回溯时计算:- 子节点方向的最大连通块- 父节点方向的剩余连通块 4. 比较并更新全局最小值 5. 最终输出所有可能分割方案中的最优解搞清子节点和父节点!!!!很关键
子节点的大小计算如下图:
父节点就是n-累加的所有子节点数啦
#include<bits/stdc++.h>
using namespace std;const int N = 1e5 + 10; // 最大节点数
vector<int> edges[N]; // 邻接表存储树结构
int n; // 节点总数
int min_max = INT_MAX; // 存储最小的最大连通块大小(初始化为极大值)/*** 深度优先搜索计算子树信息* @param u 当前节点* @param parent 父节点(用于防止回溯)* @return 以u为根的子树节点数*/
int dfs(int u, int parent) {int subtree_size = 1; // 当前子树节点数(至少包含自己)int max_part = 0; // 删除u后最大的连通块大小// 遍历所有邻接节点(包含父节点和子节点)for (int v : edges[u]) {if (v == parent) continue; // 跳过父节点防止回溯// 递归获取子树的节点数(此时u是v的父节点)int child_size = dfs(v, u);max_part = max(max_part, child_size); // 更新子节点方向的最大块subtree_size += child_size; // 累加子树规模,用于计算父节点数目}// 子节点的最大块为max_part 父节点方向的连通块大小 = 总节点数 - 当前子树规模max_part = max(max_part, n - subtree_size);// 全局维护最小值(所有节点的最大连通块中的最小值)min_max = min(min_max, max_part);return subtree_size; // 返回当前子树的规模(给上层递归使用)
}int main() {// 加速输入输出(处理大规模数据时效果显著)ios::sync_with_stdio(false);cin.tie(nullptr);cin >> n;// 构建树结构(n-1条边)for (int i = 0; i < n-1; ++i) {int a, b;cin >> a >> b;edges[a].push_back(b); // 无向图双向连接edges[b].push_back(a);}dfs(1, -1); // 从任意节点开始遍历(根节点设为1,父节点不存在用-1表示)cout << min_max << endl;return 0;
}
相关文章:
图论--DFS搜索图/树
目录 一、图的存储结构 二、题目练习 846. 树的重心 - AcWing题 dfs,之前学习的回溯算法好多都是用dfs实现搜索的(把题目抽象成树形结构来搜索),其实 回溯算法就是 深搜,只不过针对某一搜索场景 我们给他一个更细分…...
Visual Studio + OpenCV C++ 安装与配置教程
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛用于图像处理、视频分析、模式识别和机器学习等领域。它由Intel公司于1999年发起,并在2000年由Willow Garage(一个机器人研究机构)进一步开发和维护。OpenCV支持多种编程语言,包括C++、Python…...
Java核心知识点的系统整理(一)
目录 一、数据类型与运算符秘籍 1. 四类八种数据类型 2. 自增运算符的暗战 3. 位运算与逻辑运算对决 二、流程控制三剑客 1. 分支结构抉择 2. 循环控制四骑士 三、面向对象核心机制 1. final的三重封印 2. 静态成员生存法则 四、进阶特性解密 1. 多态的三重境界 2…...
在Android Studio中,`Settings`里的Gradle路径、环境变量以及`gradle - wrapper.properties`文件关联
在Android Studio中,Settings里的Gradle路径、环境变量以及gradle - wrapper.properties文件关联 Android Studio中Settings里的Gradle路径 在Android Studio的Settings(Preferences ) -> Build, Execution, Deployment -> Build Tools -> Gradle 中: Use defau…...
算法复习(二分+离散化+快速排序+归并排序+树状数组)
一、二分算法 二分算法,堪称算法世界中的高效查找利器,其核心思想在于利用数据的有序性,通过不断将查找区间减半,快速定位目标元素或满足特定条件的位置。 1. 普通二分 普通二分适用于在有序数组中查找特定元素的位置。我们可以…...
VSCode写java时常用的快捷键
首先得先安好java插件 1、获取返回值 这里是和idea一样的快捷键的,都是xxxx.var 比如现在我new一个对象 就输入 new MbDo().var // 点击回车即可变成下面的// MbDo mbDo new MbDo()//以此类推get方法也可获取 mbDo.getMc().var // 点击回车即可变成下面的 // St…...
【Code】《代码整洁之道》笔记-Chapter16-重构SerialDate
第16章 重构SerialDate 如果你找到JCommon类库,深入该类库,其中有个名为org.jfree.date的程序包。在该程序包中,有个名为SerialDate的类,我们即将剖析这个类。 SerialDate的作者是David Gilbert。David显然是一位经验丰富、能力…...
使用 Node.js、Express 和 React 构建强大的 API
了解如何使用 Node.js、Express 和 React 创建一个强大且动态的 API。这个综合指南将引导你从设置开发环境开始,到集成 React 前端,并利用 APIPost 进行高效的 API 测试。无论你是初学者还是经验丰富的开发者,这篇文章都适合你。 今天&#…...
深度学习入门:神经网络的学习
目录 1 从数据中学习1.1 数据驱动1.2 训练数据和测试数据 2损失函数2.1 均方误差2.2 交叉熵误差2.3 mini-batch学习2.4 mini-batch版交叉熵误差的实现2.5 为何要设定损失函数 3 数值微分3.1 数值微分3.3 偏导数 4 梯度4.1 梯度法4.2 神经网络的梯度 5 学习算法的实现5.1 2层神经…...
OSI参考模型和TCP/IP模型
1.OSI参考模型 OSI模型: OSI参考模型有7层,自下而上依次为物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。(记忆口诀:物联网叔会用)。低…...
人工智能中的卷积神经网络(CNN)综述
文章目录 前言 1. CNN的基本原理 1.1 卷积层 1.2 池化层 1.3 全连接层 2. CNN的发展历程 2.1 LeNet-5 2.2 AlexNet 2.3 VGGNet 2.4 ResNet 3. CNN的主要应用 3.1 图像分类 3.2 目标检测 3.3 语义分割 3.4 自然语言处理 4. 未来研究方向 4.1 模型压缩与加速 4.2 自监督学习 4.3 …...
WordPress - 此站点出现严重错误
本篇讲 当WordPress出现 此站点出现严重错误 时,该如何解决。 目录 1,现象 2, FAQ 3,管理Menu无法打开 下面是详细内容。 1,现象 此站点出现严重错误(このサイトで重大なエラーが発生しました&#x…...
力扣每日打卡 1534. 统计好三元组 (简单)
力扣 1534. 统计好三元组 简单 前言一、题目内容二、解题方法1. 暴力解法2.官方题解2.1 方法一:枚举2.2 方法二:枚举优化 前言 这是刷算法题的第十二天,用到的语言是JS 题目:力扣 1534. 统计好三元组 (简单) 一、题目内容 给你一…...
《Vue3学习手记2》
今天主要学习Vue3中的数据监视: ps: 代码中的注释写的很详细,这样更有利于理解 watch 作用: 监视数据的变化(和Vue2中watch作用一致) 特点: Vue3中的watch只能监视以下四种数据: ref创建定义的数据(基本类型、对象类型)reactiv…...
在pycharm中搭建yolo11分类检测系统1--PyQt5学习(一)
实验条件:pycharm24.3autodlyolov11环境PyQt5 如果pycharm还没有配PyQt5的话就先去看我原先写的这篇博文: PyQT5安装搭配QT DesignerPycharm)-CSDN博客 跟练参考文章: 目标检测系列(四)利用pyqt5实现yo…...
【经验记录贴】使用配置文件提高项目的可维护性
mark一下。 整体修改前后如下: 课题: 在项目中有一个支持的文件类型的FILE_TYPE的定义, 这个是写死在主程序中,每次增加可以支持的文件类型的时候,都需要去修改主程序中这个FILGE_TYPE的定义。 主程序修改其实不太花时…...
从JSON到SQL:基于业务场景的SQL生成器实战
引言 在数据驱动的业务场景中,将业务需求快速转化为SQL查询是常见需求。本文将通过一个轻量级的sql_json_to_sql函数,展示如何将JSON格式的查询描述转换为标准SQL语句,并结合实际业务场景验证其功能。 核心代码解析 1. 代码实现 def sql_j…...
空格键会提交表单吗?HTML与JavaScript中的行为解析
在网页开发中,理解用户交互细节对于提供流畅的用户体验至关重要。一个常见的问题是:空格键是否会触发表单提交?本文将通过一个简单的示例解释这一行为,并探讨如何使用HTML和JavaScript来定制这种交互。 示例概览 考虑以下HTML代…...
06 - 多线程-JUC并发编程-原子类(二)
上一章,讲解java (java.util.concurrent.atomic) 包中的 支持基本数据类型的原子类,以及支持数组类型的原子类,这一章继续讲解支持对实体类的原子类,以及原子类型的修改器。 还有最后java (java…...
vue3 实现谷歌登录
很多人都是直接在 index.html 文件中引入的,刚开始我也那样写但是谷歌的api只能调起一次后续就不会生效了 我的登录是个弹窗,写在app.vue 文件中 const isGoogleLoaded ref(true);onMounted(async () > {initialize(); }); // 初始化 const initi…...
SOME/IP中”客户端消费“及”服务端提供”的解析
先上结论 AREthAddConsumedEventGroup-->客户端的函数-->谁调用 Consumed函数,谁就是消费者 AREthAddProvidedEventGroup-->服务端的函数-->谁调用 Provided函数,谁就是服务端 Server 端:AREthAddProvidedEventGroup → 声明 &…...
GO语言入门:字符串处理1(打印与格式化输出)
13.1 打印文本 在 fmt 包中,Print 函数用于打印(输出)文本信息。依据输出目标的不同,Print 函数可以划分为三组,详见下表。 按应用目标分组函数说明将文本信息输出到标准输出流,一般是输出到屏幕上Print将…...
Linux 深入浅出信号量:从线程到进程的同步与互斥实战指南
知识点1【信号量概述】 信号量是广泛用于进程和线程间的同步和互斥。信号量的本质 是一个非负的整数计数器,它被用来控制对公共资源的访问 当信号量值大于0的时候,可以访问,否则将阻塞。 PV原语对信号量的操作,一次P操作使信号…...
Oracle数据库数据编程SQL<9.1 数据库逻辑备份和迁移exp和imp之导出、导入>
EXP (Export) 和 IMP (Import) 是 Oracle 提供的传统数据导出导入工具,用于数据库逻辑备份和迁移。尽管在较新版本中已被 Data Pump (EXPDP/IMPDP) 取代,但在某些场景下仍然有用。 目录 一、EXP 导出工具 1. 基本语法 2. 常用参数说明 3. 导出模式 3.1 表模式导出 3.2 用…...
DotnetCore开源库SampleAdmin源码编译
1.报错: System.Net.Sockets.SocketException HResult0x80004005 Message由于目标计算机积极拒绝,无法连接。 SourceSystem.Net.Sockets StackTrace: 在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, C…...
Kaggle-Disaster Tweets-(二分类+NLP+模型融合)
Disaster Tweets 题意: 就是给出一个dataframe包含text这一列代表着文本,文本会有一些词,问对于每条记录中的text是真关于灾难的还是假关于灾难的。 比如我们说今天作业真多,这真是一场灾难。实际上这个灾难只是我们调侃而言的。…...
搭建一个网站需要选择什么配置的服务器?
一般要考虑网站规模、技术需求等因素来进行选择。 小型网站:个人博客、小型企业官网等日均量在 1000 以内的网站,一般推荐2 核 CPU、4GB 内存、50GB 硬盘,带宽 1 - 5M。如果是纯文字内容且图片较少的小型网站,初始阶段 1 核 CPU、…...
idea如何使用git
在 IntelliJ IDEA 中使用 Git 的详细步骤如下,分为配置、基础操作和高级功能,适合新手快速上手: 一、配置 Git 安装 Git 下载并安装 Git,安装时勾选“Add to PATH”。验证安装:终端输入 git --version 显示版本…...
webpack vite
1、webpack webpack打包工具(重点在于配置和使用,原理并不高优。只在开发环境应用,不在线上环境运行),压缩整合代码,让网页加载更快。 前端代码为什么要进行构建和打包? 体积更好&#x…...
.Net 9 webapi使用Docker部署到Linux
参考文章连接: https://www.cnblogs.com/kong-ming/p/16278109.html .Net 6.0 WebApi 使用Docker部署到Linux系统CentOS 7 - 长白山 - 博客园 项目需要跨平台部署,所以就研究了一下菜鸟如何入门Net跨平台部署,演示使用的是Net 9 webAPi Li…...


