代码随想录算法训练营第五十天|图论基础|深度优先搜索理论基础|KM98.所有可达路径|广度优先搜索理论基础

图论基础

1、图的基本概念

        二维坐标中,两点可以连成线,多个点连成的线就构成了图。

        当然图也可以就一个节点,甚至没有节点(空图)

2、图的种类

        整体上一般分为有向图无向图

                有向图是指图中边是有方向的;

                无向图是指 图中边没有方向;

                加权有向图,就是图中边是有权值的;

3、度

        无向图中有几条边连接该节点,该节点就有几度。

        在有向图中,每个节点有出度和入度。

                出度:从该节点出发的边的个数。

                入度:指向该节点边的个数。

4、强连通图

        强连通图是在有向图中任何两个节点是可以相互到达;

5、连通分量

        无向图中节点构成的子图就是该无向图中的一个连通分量,该子图所有节点都是相互可达到的,且必须是极大联通子图才能是连通分量;

6、图的构造

        如何用代表来表示一个图呢?一般使用邻接表邻接矩阵或者用来表示,主要是朴素存储、邻接表和邻接矩阵

①邻接矩阵 

        邻接矩阵 使用 二维数组来表示图结构。 邻接矩阵是从节点的角度来表示图,有多少节点就申

请多大的二维数组。

        例如: grid[2][5] = 6,表示 节点 2 连接 节点5 为有向图,节点2 指向 节点5,边的权值为6。

如果想表示无向图,即:grid[2][5] = 6,grid[5][2] = 6,表示节点2 与 节点5 相互连通,权值为6。

优点:

        1、表达方式简单,易于理解

        2、检查任意两个顶点间是否存在边的操作非常快

        3、适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。

缺点: 遇到稀疏图,会导致申请过大的二维数组造成空间浪费 且遍历 边 的时候需要遍历整个n * n矩阵,造成时间浪费

②邻接表

        邻接表 使用 数组 + 链表的方式来表示。 邻接表是从边的数量来表示图,有多少边 才会申请对应大小的链表。

优点:

        1、对于稀疏图的存储,只需要存储边,空间利用率高

        2、遍历节点连接情况相对容易

缺点:

        1、检查任意两个节点间是否存在边,效率相对低,需要 O(V)时间,V表示某节点连接其他节点的数量。

        2、实现相对复杂,不易理解

7、图的遍历方式

        1、深度优先搜索(dfs):二叉树的递归遍历,是dfs 在二叉树上的遍历方式。

        2、广度优先搜索(bfs):二叉树的层序遍历,是bfs 在二叉树上的遍历方式。

深度优先搜索理论基础

1、dfs和bfs的区别

        ①dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)。

        ②bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。

 2、深度搜索三部曲

        1、确认递归函数,参数

        2、确认终止条件

        3、处理目前搜索节点出发的路径

98. 所有可达路径

1、确认递归函数,参数

        我们dfs函数一定要存一个图,用来遍历的,需要存一个目前我们遍历的节点,定义为x;还需要存一个n,表示终点,我们遍历的时候,用来判断当 x==n 时候 标明找到了终点。

2、确认终止条件

        当目前遍历的节点 为 最后一个节点 n 的时候 就找到了一条 从出发点到终止点的路径;

3、处理目前搜索节点出发的路径

        接下来是走 当前遍历节点x的下一个节点。首先是要找到 x节点指向了哪些节点呢?接下来就是将 选中的x所指向的节点,加入到 单一路径来。最后进入下一层递归;

# 邻接矩阵写法
def dfs(graph, x, n, path, res):# 当前遍历的接地点x,到达节点n;if x == n:res.append(path.copy())return# 遍历节点x连接的所有节点for i in range(1, n+1):# 找到x指向的节点,就是节点iif graph[x][i] == 1:# 遍历到的节点加入到路径中来path.append(i)# 进入下一层递归dfs(graph, i, n, path, res)# 回溯,撤销本节点path.pop()def main():n, m = map(int, input().split())graph = [[0]*(n+1) for _ in range(n+1)]for _ in range(m):s, t = map(int, input().split())graph[s][t] = 1res = []dfs(graph, 1, n, [1], res)if not res:print(-1)else:for path in res:print(' '.join(map(str, path)))if __name__ == '__main__':main()
# 邻接表写法
from collections import defaultdictresult = []  # 收集符合条件的路径
path = []  # 1节点到终点的路径def dfs(graph, x, n):if x == n:  # 找到符合条件的一条路径result.append(path.copy())returnfor i in graph[x]:  # 找到 x指向的节点path.append(i)  # 遍历到的节点加入到路径中来dfs(graph, i, n)  # 进入下一层递归path.pop()  # 回溯,撤销本节点def main():n, m = map(int, input().split())graph = defaultdict(list)  # 邻接表for _ in range(m):s, t = map(int, input().split())graph[s].append(t)path.append(1)  # 无论什么路径已经是从1节点出发dfs(graph, 1, n)  # 开始遍历# 输出结果if not result:print(-1)for pa in result:print(' '.join(map(str, pa)))if __name__ == "__main__":main()

 广度优先搜索理论基础

        广搜的搜索方式就适合于解决两个点之间的最短路径问题。

        因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。

1、广度搜索的过程

        BFS是一圈一圈的搜索过程,但具体是怎么一圈一圈来搜;

        假如每次搜索的方向为 上下左右(不包含斜上方),那么给出一个start起始位置,那么BFS就是从四个方向走出第一步,如下图所示:

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

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

相关文章

《Vue3实战教程》40:Vue3安全

如果您有疑问,请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时,它会立刻成为我们最关心的问题,会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞,请发送电子邮件至 securityvuejs.org。…

2025年1月4日蜻蜓q旗舰版st完整开源·包含前后端所有源文件·开源可商用可二开·优雅草科技·优雅草kir|优雅草星星|优雅草银满|优雅草undefined

2025年1月4日蜻蜓q旗舰版st完整开源包含前后端所有源文件开源可商用可二开优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined 产品介绍: 本产品主要贡献者优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined-青史留名,时光如川浪淘…

计算机网络练习题

学习这么多啦,那就简单写几个选择题巩固一下吧! 1. 在IPv4分组各字段中,以下最适合携带隐藏信息的是(D) A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中,数据链路层的主要功能是(…

【UE5 C++课程系列笔记】21——弱指针的简单使用

目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中,弱指针(TWeakPtr )也是一种智能指针类型,主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下,提供一种可…

Spring Boot 的自动配置,以rabbitmq为例,请详细说明

Spring Boot 的自动配置特性能够大大简化集成外部服务和组件的配置过程。以 RabbitMQ 为例,Spring Boot 通过 spring-boot-starter-amqp 提供了自动配置支持,开发者只需在应用中添加相关依赖并配置必要的属性,Spring Boot 会自动配置所需的连…

2025/1/4期末复习 密码学 按老师指点大纲复习

我们都要坚信,道路越是曲折,前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…

Vulnhub靶场(Earth)

项目地址 https://download.vulnhub.com/theplanets/Earth.ova.torrent 搭建靶机 官网下载.ova文件双击vm打开导入 获取靶机IP kail终端输入 arp-scan -l 获取靶机 IP 192.168.131.184 信息收集 端口扫描 sudo nmap -sC -sV -p- 192.168.131.184 可以看到开启22端口&…

Linux菜鸟级常用的基本指令和基础知识

前言:很多Linux初学者都会头疼于指令太多记不住,笔者刚学习Linux时也是如此,学习Linux指令时,学了后面的指令,前面的指令也会忘的差不多了,针对于以上这些情况,笔者今天来分享一篇Linux菜鸟级的常用指令的博…

使用SSH建立内网穿透,能够访问内网的web服务器

搞了一个晚上,终于建立了一个内网穿透。和AI配合,还是得自己思考,AI配合才能搞定,不思考只依赖AI也不行。内网服务器只是简单地使用了python -m http.server 8899,但是对于Gradio建立的服务器好像不行,会出…

2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无

2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无 前端代码开源库 关于开源说明:企业服务-招聘信息管理系统-前端uniapp-系统前端开放源代码仅供学习-优雅草科技-目前优雅草科…

HTML——75. 内联框架

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>内联框架</title><style type"text/css">iframe{width: 100%;height: 500px;}</style></head><body><!--iframe元素会创建包含…

Ajax原理-XMLHttpRequest

1. XMLHttpRequest 是什么&#xff1f; 和axios的关系&#xff1a; axios 内部采用 XMLHttpRequest 与服务器交互 学习XMLHttpRequest的目的&#xff1a; 掌握使用 XHR 与服务器进行数据交互&#xff0c;了解 axios 内部原理&#xff0c;加强对知识的理解&#xff0c;提升技…

离散数学 期末笔记

命题符号化 使用等值演算法证明 求公式范式 在自然推理体系中构造下列推理的证明 在一阶逻辑中将下列命题符号化 设A、B、C、D是 Z 的子集 证明下列集合恒等式 二元关系 性质 没有空的 没有漏的 没有重复 函数

Fabric环境部署-Git和Node安装

一.安装Git&#xff08;v2.43.0&#xff09; Git 是一个开源的分布式版本管理系统&#xff08;也是全球最大的开源软件存储服务器&#xff09;&#xff0c;用于敏捷高效地处理任何或小或大的项目。搭建区块链需要使用Git&#xff0c;因为区块链的开发和部署需要使用版本控制工…

springCloud 脚手架项目功能模块:Java分布式锁

文章目录 引言分布式锁产生的原因:集群常用的分布式锁分布式锁的三种实现方式I ZooKeeper 简介zookeeper本质上是一个分布式的小文件存储系zookeeper特性:全局数据一致性ZooKeeper的应用场景分布式锁(临时节点)II 基于ZooKeeper 实现一个排他锁创建锁获取锁释放锁Apache Zo…

stm32入门元件介绍

stm32入门元件介绍 文章目录 stm32入门元件介绍入门套件总览套件介绍面包板面包板跳线/飞线杜邦线STM32最小系统板STLINKOLED显示屏LED按键电位器蜂鸣器光敏/热敏电阻传感器/对射式/反射式红外传感器旋转编码器USB转串口MPU6050陀螺仪加速度计W25Q64 Flash闪存TB6612FNG电机驱动…

C语言:调试的概念和调试器的选择

所谓调试&#xff08;Dubug&#xff09;&#xff0c;就是跟踪程序的运行过程&#xff0c;从而发现程序的逻辑错误&#xff08;思路错误&#xff09;&#xff0c;或者隐藏的缺陷&#xff08;Bug&#xff09;。 在调试的过程中&#xff0c;我们可以监控程序的每一个细节&#xff…

Python深度学习GRU、LSTM 、BiLSTM-CNN神经网络空气质量指数AQI时间序列预测及机器学习分析|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p38742 分析师&#xff1a;Zhixiong Weng 人们每时每刻都离不开氧&#xff0c;并通过吸入空气而获得氧。一个成年人每天需要吸入空气达6500升以获得足够的氧气&#xff0c;因此&#xff0c;被污染了的空气对人体健康有直接的影响&…

Flink源码编译与运行

1 准备 准备好Java 8环境和编译器&#xff08;如IDEA&#xff09;。 下载源码&#xff1a; 官网&#xff1a;https://flink.apache.org/downloads/。GitHub&#xff1a;https://github.com/apache/flink。 2 编译 在IDEA终端&#xff0c;使用下面命令之一编译源码&#xff…

Elasticsearch:Lucene 2024 年回顾

作者&#xff1a;来自 Elastic Chris Hegarty 2024 年对于 Apache Lucene 来说又是重要的一年。在本篇博文中&#xff0c;我们将探讨主要亮点。 Apache Lucene 在 2024 年表现出色&#xff0c;发布了许多版本&#xff0c;包括三年来的首次重大更新&#xff0c;其中包含令人兴奋…