C++ dfs 有关图的知识(四十六)【第七篇】

今天我们来讲一下树上的搜索知识。

1.树上搜索

树上搜索,我们之前学习了一种特殊的结构,树!

我们之前研究了图上的搜索,我们之前还学了树这种特殊的图,接下来我们就来研究一下在树上的搜索。

如果想要遍历整棵树,可以和图一样,从一个点开始(一般从根开始),每次找一个没有访问过的点访问就可以了。

但是树总有它的特殊性,那就是从根开始搜索,到达每个点的时候一定只有它的父节点是之前访问过的,所以我们并不必使用vis数组记录每个点有没有被访问过,只需要记录每个点的父节点是哪个节点,这样看这个点连着的节点时,就只需要判断它不是这个点的父节点就可以往下搜索了。

图片

比如这样一个图,如果 1 是根,那访问到 
2 的时候一定可以走 
4 和 6 ,只是不能走 
1 ,那就走 
4 和 6 就可以了。

记录父节点可以使用一个数组,不过如果之后我们不会再关心每个点的父节点是谁,只是在这次搜索才用,那就可以直接把父节点当作参数传进来。

这样搜索代码写下来就是这样

void dfs(int u, int fa) { // fa 就是父节点cout << u << endl;for (int i = 0; i < G[u].size(); i++) {int v = G[u][i];if (v != fa) {dfs(v, u); // 那往下搜索,到 v 的时候父节点就是我们目前在的节点 u}}
}
 

调用dfs从根搜索的时候传给fa的参数常常是这个根本身或者一个不存在的点 0。

平常输入树的方式有很多,比如明确说明每个点的父节点,或者明确说明了一个点是另一个点的父节点,此时,我们只需要父节点向子节点连有向边就足够了,对于根节点,有可能会明确知道,如果不知道,那可以统计每个点是不是有父节点或者统计每个点的度数来找到根节点,此时fa这个参数也可以就不用了。

例如下面是一些输入数据,共 
4 行,每行两个整数 u, v示 u 是 
v 的父节点。

#include <iostream>
#include <vector>
using namespace std;
vector <int> G[105];
void dfs(int u, int fa) {cout << u << endl;for (int i = 0; i < G[u].size(); i++) {int v = G[u][i];if (v != fa) {dfs (v, u);}}
}
int main() {int n;cin >> n;for (int i = 1; i < n; i++) {int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}dfs (1, 0);return 0;
}

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

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

相关文章

react 之 Class API

class API就是编写类组件&#xff0c;虽然react官方不在推荐使用&#xff0c;但是一般公司里维护的老项目里还是有的&#xff0c;可以简单了解下 1.类组件的基础结构 类组件就是通过js里的类来组织组件的代码的 1️⃣通过类属性state定义状态数据 2️⃣通过setState方法来修…

你的BOSS被攻击时的闪白效果

点击上方亿元程序员关注和★星标 引言 被攻击时的闪白效果 在许多游戏中&#xff0c;为了增加战斗的紧张感和玩家体验&#xff0c;开发者通常会采用一些视觉效果来强调角色或物体受到攻击的瞬间。 其中&#xff0c;受击闪白效果是一种常见的设计手法&#xff0c;通过在目标上…

CSS transition(过渡效果)详解并附带示例

CSS过渡效果&#xff08;CSS transitions&#xff09;是一种在元素属性值发生变化时&#xff0c;通过指定过渡效果来实现平滑的动画效果的方法。通过定义起始状态和结束状态之间的过渡属性&#xff0c;可以使元素的变化更加流畅和可视化。 过渡效果的基本语法如下&#xff1a;…

vit细粒度图像分类(九)RAMS-Trans学习笔记

1.摘要 在细粒度图像识别(FGIR)中&#xff0c;区域注意力的定位和放大是一个重要因素&#xff0c;基于卷积神经网络(cnn)的方法对此进行了大量探索。近年来发展起来的视觉变压器(ViT)在计算机视觉任务中取得了可喜的成果。与cnn相比&#xff0c;图像序列化是一种全新的方式。然…

Harbor介绍、整体架构和安装

1.Harbor介绍 Harbor 是由 VMware 开源的一款云原生制品仓库&#xff0c;Harbor 的核心功能是存储和管理 Artifact。Harbor 允许用户用命令行工具对容器镜像及其他 Artifact 进行推送和拉取&#xff0c;并提供了图形管理界面帮助用户查看和管理这些 Artifact。在 Harbor 2.0 版…

爬虫(二)

1.同步获取短视频 1.只要播放地址对Json数据解析&#xff0c;先把列表找出&#xff1a; 2.只想要所有的播放地址&#xff0c;通过列表表达式循环遍历这个列表拿到每个对象&#xff0c;再从一个个对象里面找到Video,再从Video里面找到播放地址(play_addr),再从播放地址找到播放…

系统架构20 - 统一建模语言UML(上)

统一建模语言 组成要素事物关系 在目前的软件开发方法中&#xff0c;面向对象的方法占据着主导地位。面向对象方法的主导地位也决定着软件开发过程模型化技术的发展&#xff0c;面向对象的建模技术方法也就成为主导的方法。 公认的面向对象建模语言出现于20世纪70年代中期。从1…

【乳腺肿瘤诊断分类及预测】基于自适应SPREAD-PNN概率神经网络

课题名称&#xff1a;基于自适应SPREAD-PNN的乳腺肿瘤诊断分类及预测 版本日期&#xff1a;2023-06-15 运行方式: 直接运行PNN0501.m 文件即可 代码获取方式&#xff1a;私信博主或QQ&#xff1a;491052175 模型描述&#xff1a; 威斯康辛大学医学院经过多年的收集和整理&…

四、图像像素读写操作

一、图像像素读写——头文件 在项目的头文件中&#xff0c;右击添加&#xff0c;新建项 创建用于对图像显示进行操作的头文件&#xff0c;我这边是pixel_operate.h 该头文件声明了一个Pixel类(class Pixel)&#xff0c;该类下面声明一个函数(void pixel_operate(Mat &i…

创建一个Vue项目(含npm install卡住不动的解决)

目录 1 安装Node.js 2 使用命令提示符窗口创建Vue 2.1 打开命令提示符窗口 2.2 初始Vue项目 2.2.1 npm init vuelatest 2.2.2 npm install 3 运行Vue项目 3.1 命令提示符窗口 3.2 VSCode运行项目 1 安装Node.js 可以看我的这篇文章《Node.js的安装》 2 使用命令提示…

ruoyi(若依)(el-menu也可参考)菜单栏过长显示省略号才显示气泡

一、背景 若依前后端分离的版本&#xff0c;新版本中优化了菜单名称过长悬停显示标题&#xff0c;但是是悬浮所有长度大于5的标题。可以查看提交记录&#xff1a;https://gitee.com/y_project/RuoYi-Cloud/commit/99932d91c0144da9f34f5bb05683cc0b86303217 但是我希望是只悬浮…