图论--DFS搜索图/树

news/2025/4/22 0:55:50

目录

一、图的存储结构

二、题目练习

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;
}


https://dhexx.cn/news/show-5497393.html

相关文章

Flink SQL SavePoint最佳实践

以下是 Flink SQL Savepoint 最佳实践&#xff0c;涵盖配置、触发、恢复及注意事项&#xff0c;高效管理作业状态&#xff1a; 一、Savepoint 的配置与触发 1. 基础配置 存储路径&#xff1a;在 flink-conf.yaml 中全局设置 Savepoint 存储目录&#xff0c;避免每次手动指定路…

鸿蒙应用元服务开发-Account Kit配置登录权限

一、场景介绍 华为账号登录是基于OAuth 2.0协议标准和OpenID Connect协议标准构建的OAuth2.0 授权登录系统&#xff0c;元服务可以方便地获取华为账号用户的身份标识&#xff0c;快速建立元服务内的用户体系。 用户打开元服务时&#xff0c;不需要用户点击登录/注册按钮&#…

NLP高频面试题(四十二)——RAG系统评估:方法、指标与实践指南

1. 引言:RAG系统概述与评估挑战 检索增强生成(Retrieval-Augmented Generation,简称 RAG)是近年来自然语言处理领域的一个重要进展。RAG系统在大型语言模型生成文本的过程中引入了外部检索模块,从外部知识库获取相关信息,以缓解纯生成模型可能出现的幻觉和知识盲点。通过…

基于vue2+ElementUI的el-tree封装一个带搜索的树形组件

需求 实现一个如图带搜索框的下拉树形组件。 解决方案 利用el-inputel-tree实现自定义带搜索的下拉树形组件。 具体实现步骤 1、创建TreeSelect组件 <template><div class"tree-select-wrapper" v-clickoutside"handleClose"><el-inpu…

Margin和Padding在WPF和CSS中的不同

CSS和WPF中 margin 与 padding 在方向上的规定基本一致&#xff0c;但在使用场景和一些细节上有所不同。 CSS - 方向规定&#xff1a; margin 和 padding 属性可以分别指定上、右、下、左四个方向的值。例如 margin:10px 20px 30px 40px; 表示上外边距为10px、右外边距为20…

实现添加用户和SpringBoot-实现修改和删除

实现跳转到修改页面&#xff1a; GetMapping("/updateuser.html") public String updateUser(Integer id,Model model){User user userService.getOneById(id);model.addAttribute("user",user);List<Address> addresses addressService.getAll()…

bash的特性-常用的通配符

在Linux或Unix系统中&#xff0c;Bash作为最常用的命令行解释器之一&#xff0c;提供了多种通配符&#xff08;wildcards&#xff09;来帮助用户更高效地进行文件操作。这些通配符可以用来匹配多个文件名或路径名&#xff0c;极大地简化了批量处理任务。本文将详细介绍Bash中常…

Ubuntu安装yum遇到Package ‘yum‘ has no installation candidate

环境说明 Window11&#xff0c;WSL2&#xff0c;Ubuntu24.04 错误描述 rootLAPTOP:~# apt-get install yum Reading package lists... Done Building dependency tree... Done Reading state information... Done Package yum is not available, but is referred to by anot…

【AI提示词】运营经理

提示说明 运营经理是企业中负责日常运营管理的关键角色&#xff0c;通过专业的运营管理知识&#xff0c;帮助企业实现目标和提升效益。 提示词 # 角色 运营经理## 注意 运营经理旨在为用户提供高效的运营管理建议和策略&#xff0c;帮助用户在实际工作中提升效率和效果。## …

【Sequelize】关联模型和孤儿记录

一、关联模型的核心机制 1. 关联类型与组合规则 • 基础四类型&#xff1a; • hasOne&#xff1a;外键存储于目标模型&#xff08;如用户档案表存储用户ID&#xff09; • belongsTo&#xff1a;外键存储于源模型&#xff08;如订单表存储用户ID&#xff09; • hasMany&…