数据结构与算法 - 图

  • 博客主页:誓则盟约
  • 系列专栏:IT竞赛 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

  1. 图的定义和基本概念

    • 图(Graph)是一种由顶点(Vertex,也称为节点 Node)和边(Edge)组成的数据结构。

      顶点是图中的基本元素,表示某个对象或实体。顶点可以用一个标识符来表示,例如一个数字或一个字符串。

      边则用于连接图中的顶点,表示顶点之间的关系。边可以是有向的,也可以是无向的。

      在无向图中,边没有方向,顶点之间的连接是双向的。如果顶点 v 和顶点 w 之间有一条无向边,那么我们可以说 v 和 w 是相邻的,并且从 v 可以到达 w ,从 w 也可以到达 v 。

      在有向图中,边是有方向的,从一个顶点指向另一个顶点。如果有一条从顶点 u 到顶点 v 的有向边,我们表示为 (u, v) ,那么可以说 u 是 v 的前驱,v 是 u 的后继。从 u 可以沿着边到达 v ,但从 v 不一定能直接到达 u ,除非存在另一条从 v 到 u 的有向边。

有向图(Directed Graph)和无向图(Undirected Graph)是图的两种主要类型,它们的主要区别在于边的方向性:

无向图
 

  • 边的特征:在无向图中,边没有方向,顶点之间的连接是双向的。如果存在一条连接顶点 u 和顶点 v 的边,那么既可以从 u 到达 v,也可以从 v 到达 u 。
  • 表示方法:通常用一对顶点来表示一条边,例如 (u, v) 表示顶点 u 和顶点 v 之间有一条边。由于边是无向的,所以 (u, v) 和 (v, u) 表示的是同一条边。
  • 应用场景:适用于表示顶点之间对称的关系,比如朋友关系(如果 A 是 B 的朋友,那么 B 也是 A 的朋友)。
  •  

    有向图

  • 边的特征:在有向图中,边是有方向的,从一个顶点指向另一个顶点。如果存在一条从顶点 u 到顶点 v 的有向边,那么只能从 u 沿着边的方向到达 v,而不能从 v 沿着这条边到达 u ,除非存在另一条从 v 到 u 的有向边。
  • 表示方法:用一个有序对来表示一条有向边,例如 (u, v) 表示从顶点 u 到顶点 v 的有向边,与 (v, u) 是不同的边。
  • 应用场景:常用于表示具有方向性的关系,比如网页中的链接(从一个网页指向另一个网页)、任务之间的依赖关系(一个任务必须在另一个任务完成后才能开始)等。

图的表示方法

  • 邻接矩阵是用一个二维矩阵来表示图的连接关系。矩阵的行和列都对应图的顶点。若顶点和顶点之间有边相连,矩阵中的值为(或边的权值),否则为。这种表示法简单直观,适用于顶点数较少的图。
  • 邻接表是一种用于表示图的常见数据结构。对于图中的每个顶点,使用一个链表或数组来存储与其相邻的顶点。

     

    具体来说,为图中的每个顶点创建一个链表(或动态数组)。链表(或数组)中的每个节点表示与该顶点相邻的一个顶点,并可以选择性地包含边的权值等信息。

图的遍历算法

        深度优先搜索(Depth-First Search,DFS)是一种图(或者树)的遍历算法。它从起始节点开始,沿着一条路径尽可能深地访问节点,直到无法继续或达到目标节点,然后回溯到上一个未完全探索的节点,继续探索其他路径。

DFS 的原理:

  • 选择一个起始节点并将其标记为已访问。
  • 对于该节点的未访问相邻节点,选择一个进行递归访问。
  • 重复上述过程,直到没有未访问的相邻节点,然后回溯。

DFS 的实现步骤:

  1. 访问起始节点,并将其标记为已访问。
  2. 对于起始节点的每个未访问相邻节点,进行递归的 DFS 调用。
  3. 当一个节点的所有相邻节点都已被访问,回溯到上一个节点,继续探索其他未访问的相邻节点。

以下是使用 Python 实现 DFS 的代码示例:

# 定义一个图(以邻接表的形式表示)
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': [],
    'F': []
}

# 用于标记已访问的节点
visited = set()

def dfs(node):
    if node in visited:
        return
    visited.add(node)
    print(node)
    for neighbor in graph[node]:
        dfs(neighbor)

# 选择一个起始节点,例如 'A'
dfs('A')

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

答辩不用愁 :AI生成PPT让你的演讲更出色

不知道大家有没有发现,随着人工智能技术的快速发展,AI工具正逐渐渗透到我们日常生活的各个方面,极大地提高了我们的工作和学习效率。无论是AI写作、AI绘画、AI思维导图,还是AI幻灯片制作,这些工具已成为我们不可或缺的…

社区便民团购小程序源码系统 前后端分离 带完整源代码包以及搭建部署教程

系统概述 随着移动互联网的快速发展,社区团购凭借其便利性、优惠性逐渐走进人们的生活,成为了日常生活不可或缺的一部分。为了满足市场对此类服务的需求,我们特别推出了一款社区便民团购小程序源码系统,该系统采用前后端分离架构…

三河市寄大件物品快递多少钱?

在三河市,如果你需要寄送大件物品,费用问题无疑是你最关心的。不同的快递公司收费标准各异,今天,就让我们来探讨一下,从三河市寄大件物品,哪家快递更划算。 1. 祺祺寄快递: “祺祺寄快递”是一…

我的北航MEM成长之旅

领完毕业证,2年的学业生涯到此结束。为了方便大家理解后续的内容,这里我们先解释下基本信息,比如MEM到底是个啥?以及北航的MEM都学什么? 1 MEM解读 1.1 MEM是什么? MEM是"Master of Engineering Ma…

【力扣高频题】011. 盛最多水的容器

前面的算法文章,更新了许多 专题系列 。包括:滑动窗口、动态规划、加强堆、二叉树递归套路 等。 还没读过的小伙伴可以关注一下,在主页中点击对应链接查看哦~ 接下来的一段时间,将持续 「力扣高频题」 系列文章,想刷 …

Eslint prettier airbnb规范 配置

1.安装vscode的Eslint和prettier 插件 eslint:代码质量检查工具 https://eslint.nodejs.cn/docs/latest/use/getting-started prettier:代码风格格式化工具 https://www.prettier.cn/docs/index.html /* eslint-config-airbnb-base airbnb 规范 esl…

基于单片机和组态王的温度监控系统的设计

摘 要 : 介绍了以 MSP430 单片机为核心 , 建立基于 DS18B20 和组态王的温度采集和监控系统。主要研究了单片机和组态王的通用通讯协议。按照 KingView 提供的通信协议 , 设计组态王与单片机的通信程序 , 实现了组态王与M SP430 单片机的直接串行通讯。在中药提取装置的…

2024年【建筑电工(建筑特殊工种)】模拟试题及建筑电工(建筑特殊工种)作业考试题库

题库来源:安全生产模拟考试一点通公众号小程序 2024年建筑电工(建筑特殊工种)模拟试题为正在备考建筑电工(建筑特殊工种)操作证的学员准备的理论考试专题,每个月更新的建筑电工(建筑特殊工种)作业考试题库祝您顺利通过建筑电工(建筑特殊工种)考试。 1、…

centos 安装deb格式安装包

背景 研发给了我一个deb包,需要我在centos 这种服务器操作系统上安装... deb包安装一般是使用dpkg -i xxxx.deb 命令,dpkg是Debian类型的系统,但是 通常centos是没有dpkg命令的... 直接就报:bash dpkg 未找到命令... 本来找研发给我编译rp…

基于高通8155的SNPE-PTQ量化方法介绍

一、基于高通8155的SNPE-PTQ量化与打包 量化位置与工作目录,snpe1.51与1.43环境结构相同,下面以1.51为例介绍: SNPE1.51量化:172.20.84.162:/media/share_31.106SNPE1.43量化:172.20.65.2:/media/share_31.106 脚本…

好用的兼容性测试工具推荐

兼容性测试确保软件在不同系统和环境中的一致性。本指南探讨了开发人员和QA专业人员有效检测和解决问题的工具,从而提高应用程序的稳健性和用户满意度。 好用的兼容性测试工具推荐 1.Lambda测试 它是一个由AI驱动的测试编排和执行平台,可让您使用超过300…

新能源电燃灶:变革与优势

在当今社会,能源问题日益凸显,能源危机成为了全球关注的焦点。而在厨房领域,一种名为新能源电燃灶的产品正逐渐走进人们的视野,以华火电燃灶为例,它展现出了令人瞩目的特点和潜力。 随着传统能源的逐渐枯竭和环境压力的…

使用MyBatis的动态SQL注解实现实体的CRUD操作

使用MyBatis的动态SQL注解实现实体的CRUD操作 1. 引言2. 准备工作2.1 创建数据表2.2 创建实体类 Book2.3 修改Mapper接口 BookMapper 3. 测试CRUD操作3.1 配置日志3.2 查询操作3.3 新增操作3.4 修改操作3.5 删除操作 4. 与MyBatis Plus的对比5. 动态SQL注解的适用场景5.1 动态查…

CSDN原力值涨分规则

CSDN的原力值是指用户在CSDN社区中的影响力和贡献程度的评估指标。原力值是根据用户在CSDN平台上的发表文章、获得的点赞和评论数量、参与的社区活动等多个因素综合计算得出的。较高的原力值意味着用户在CSDN社区中的影响力和知名度较高,其发表的文章和回答的问题可…

虹科技术丨跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力

来源:虹科技术丨跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力 原文链接:虹科技术 | 跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力 欢迎关注虹科,为您提供最新资讯! #PCAN #网关 #CA…

Steam夏促史低游戏推荐 Steam夏促哪有游戏值得入手

steam夏促来了,作为大型的季节特卖,这次夏促也是有很多不错的游戏,价格优惠也非常到位,想入手游戏的玩家可以抓住这次机会,夏促的时间是6.28到7.12,快去看看有没有心仪的游戏吧,本篇带来steam夏…

面试-java异常体系

1.java异常体系 error类是指与jvm相关的问题。如系统崩溃,虚拟机错误,内存空间不足。 非runtime异常不处理,程序就没有办法执行。 一旦遇到异常抛出,后面的异常就不会进行。 (1)常见的error以及exception 2.java异常要点分析…

CAM350如何移动元素?

CAM350如何移动元素? 1、选择菜单栏Edit→Move 2、然后按W键,光标变为下图的形状,然后框选需要移动的元素。 3、框选元素后如下图所示,然后右击,退出框选命令。 4、然后点选一个原点开始移动所选的元素。 移动后如下图…

MySQL数据库的存储引擎mylsam和innodb

一、存储引擎概述 1.什么是存储引擎 数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。 …

关于JVM必备的一些知识

一、类加载 【加载】 - 【链接】-【初始化】 1.1 加载(Loading) 加载阶段是类加载过程的第一步,它的主要任务是通过类的全限定名(Fully Qualified Class Name)来获取类的二进制字节流(binary data&#…