数据结构中图的概念以及遍历算法的实现

news/发布时间2024/5/15 9:58:38

在数据结构中,图(Graph)是由节点(Vertex)和连接节点的边(Edge)组成的一种非线性数据结构。图可以用来表示各种实际问题中的关系和连接,如社交网络、道路网络、电路等。

图由两个主要部分组成:节点和边。节点表示实体或对象,而边表示节点之间的连接关系。图可以分为有向图(Directed Graph)和无向图(Undirected Graph)两种类型。在有向图中,边有方向,表示从一个节点到另一个节点的单向关系;而在无向图中,边没有方向,表示节点之间的双向关系。

图的常用代码实现方式有两种:邻接矩阵(Adjacency Matrix)和邻接表(Adjacency List)。

1. 邻接矩阵:
   邻接矩阵是一个二维数组,用于表示图中节点之间的连接关系。如果图有 \(n\) 个节点,那么邻接矩阵就是一个大小为 \(n \times n\) 的矩阵。对于无向图,邻接矩阵是对称的;对于有向图,邻接矩阵可能不对称。邻接矩阵中的元素表示节点之间是否存在边,可以用 0 和 1 表示,或者用其他值表示边的权重。

   例如,以下是一个无向图的邻接矩阵表示:


   0  1  1  0 
   1  0  1  1 
   1  1  0  0 
   0  1  0  0 
   

   在邻接矩阵中,行号和列号对应于节点的标识符,矩阵中的元素表示对应节点之间是否存在边。

2. 邻接表:
   邻接表是一种更紧凑的图表示方法,它使用一个数组和一组链表来表示图中的节点和边。数组的每个元素对应一个节点,而链表中的每个节点表示与该节点相邻的节点。

   例如,以下是一个无向图的邻接表表示:


   0  : [1, 2] 
   1  : [0, 2, 3] 
   2  : [0, 1]
   3  : [1]

   在邻接表中,数组的索引表示节点的标识符,链表中的元素表示与该节点相邻的节点。

这些是图的常用代码表示方法,选择哪种方法取决于具体的应用场景和操作需求。

当涉及到图的遍历时,常用的算法是深度优先搜索(Depth-First Search,DFS)和广度优先搜索(Breadth-First Search,BFS)。下面是它们的代码实现:

深度优先搜索(Depth-First Search,DFS):

def dfs(graph, start):visited = set()  # 用集合来存储已访问的节点stack = [start]  # 用栈来实现深度优先搜索while stack:vertex = stack.pop()  # 从栈中弹出一个节点if vertex not in visited:print(vertex)  # 访问该节点visited.add(vertex)  # 将节点标记为已访问# 将该节点的邻接节点按逆序推入栈中for neighbor in reversed(graph[vertex]):if neighbor not in visited:stack.append(neighbor)

广度优先搜索(Breadth-First Search,BFS):

from collections import dequedef bfs(graph, start):visited = set()  # 用集合来存储已访问的节点queue = deque([start])  # 用队列来实现广度优先搜索while queue:vertex = queue.popleft()  # 从队列左侧弹出一个节点if vertex not in visited:print(vertex)  # 访问该节点visited.add(vertex)  # 将节点标记为已访问# 将该节点的邻接节点推入队列中for neighbor in graph[vertex]:if neighbor not in visited:queue.append(neighbor)

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

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

相关文章

【二十八】springboot整合logback实现日志管理

本章节是记录logback在springboot项目中的简单使用&#xff0c;本文将会演示如何通过logback将日志记录到日志文件或输出到控制台等管理操作。将会从以下几个方面进行讲解。最后实现将特定级别的特定日志保存到日志文件。 一、依赖 <dependency><groupId>ch.qos.l…

SpringBoot整合第三方技术-缓存

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

C++ STL详解:map

目录 一、map的使用 1.1map模板参数 1.2map的构造函数及迭代器 1.3map的容量与元素访问 1.4map中的增删查改 二、日常实操 一、map的使用 CSTL详解&#xff1a;set 通过对set的简单了解&#xff0c;我们可以知道&#xff0c;set就类似于二叉搜索树的key模型&#xff0c;…

vue2+高德地图web端开发(二)

前言&#xff1a; 高德地图输入提示与 POI 搜索相关文档&#xff1a;输入提示与 POI 搜索-服务插件和工具-进阶教程-地图 JS API 2.0 | 高德地图API (amap.com) 输入提示-输入提示-示例中心-JS API 2.0 示例 | 高德地图API (amap.com) 创建输入框&#xff1a; 引入Element组…

App测试中ios和Android有哪些区别呢?

App测试中&#xff0c;大家最常问到的问题就是&#xff1a;ios和 Android有什么区别呢&#xff1f; 在Android端&#xff0c;我们经常会使用 JavaScript、 HTML、 CSS等技术来编写一些简单的 UI界面。而 iOS端&#xff0c;我们经常会使用到 UI设计、界面布局、代码结构、 API等…

掘根宝典之C++深复制与浅复制(复制构造函数,默认复制构造函数)

到目前为止我们已经学了构造函数&#xff0c;默认构造函数&#xff0c;析构函数&#xff1a;http://t.csdnimg.cn/EOQxx 转换函数&#xff0c;转换构造函数&#xff1a;http://t.csdnimg.cn/kiHo6 友元函数&#xff1a;http://t.csdnimg.cn/To8Tj 接下来我们来学习一个新函数…

让Python自动测试更得心应手——认识一下神奇的pytest测试框架

前言 Python在测试圈的应用非常广泛&#xff0c;特别是在自动化测试以及测试开发的领域&#xff0c;其中在自动化测试中我们常用的测试框架是uniitest和pytest&#xff0c;本文将带领大家搭建以及熟悉pytest的使用。 既然有unittest那么为什么还要用pytest呢&#xff1f; 这…

wordpress好的网站主题

有什么好的网站主题&#xff0c;都分享在这里了。 蓝色风格的wordpress模板&#xff0c;好的wordpress网站主题&#xff0c;需要既好看&#xff0c;又好用。 https://www.zhanyes.com/qiye/6305.html 血红色的好看的wordpress主题&#xff0c;布局经典&#xff0c;设计好的&am…

蓝桥杯——第 5 场 小白入门赛(c++详解!!!)

文章目录 1 十二生肖基本思路&#xff1a; 2 欢迎参加福建省大学生程序设计竞赛基本思路&#xff1a;代码&#xff1a; 3 匹配二元组的数量基本思路&#xff1a;代码: 4 元素交换基本思路&#xff1a;代码&#xff1a; 5 下棋的贝贝基本思路&#xff1a;代码&#xff1a; 6 方程…

寒假作业2024.2.6

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4:请使用插入排序实现升序排序 #include <stdio.h> #include <stdl…

阿里云BGP多线精品EIP香港CN2线路低时延,价格贵

阿里云香港等地域服务器的网络线路类型可以选择BGP&#xff08;多线&#xff09;和 BGP&#xff08;多线&#xff09;精品&#xff0c;普通的BGP多线和精品有什么区别&#xff1f;BGP&#xff08;多线&#xff09;适用于香港本地、香港和海外之间的互联网访问。使用BGP&#xf…

深入实战:ElasticSearch的Rest API与迭代器模式在高效查询中的应用

在我们公司&#xff0c;大多数Java开发工程师在项目中都有使用Elasticsearch的经验。通常&#xff0c;他们会通过引入第三方工具包或使用Elasticsearch Client等方式来进行数据查询。然而&#xff0c;当涉及到基于Elasticsearch Rest API的/_sql?formatjson接口时&#xff0c;…

前端win10如何设置固定ip(简单明了)

1、右击这个 2、点击属性 3、双击协议版本4设置成以下就ok

解决用IPV6+DDNS访问UNRAID webui周期性失效的问题,smb不能访问的问题

我使用的unraid系统使用ddns&#xff08;DDNSGO&#xff09;绑定域名&#xff08;阿里域名&#xff09;与主机的ipv6地址进行远程访问&#xff0c;unraid是6.12.8。 遇到的问题是&#xff0c;配置当时是没问题的&#xff0c;但是过几天就会失效&#xff0c;无法通过域名访问we…

Rocky Linux网卡静态配置

一、开源系统 Rocky Linux 下载安装 1、安装教程 Rocky Linux 下载安装 二、远程工具 MobaXterm下载安装 1、安装教程 MobaXterm 下载安装 三、Rocky Linux 网卡配置 1、使用ip addr确认网卡名称&#xff08;此处可得知网卡为ens160&#xff09; [rootlocalhost ~]# ip a 1:…

幻兽帕鲁在腾讯云服务器中怎么修改配置?游戏难度、经验倍率等等

幻兽帕鲁的游戏配置文件应该是PalWorldSettings 找到这个文件&#xff0c;就可以修改里面的参数。 如果你是用腾讯云一键部署的幻兽帕鲁&#xff0c;则可以到轻量应用服务器管理界面&#xff0c;找到“应用管理”&#xff0c;里面有个可视化修改游戏参数的面板设置&#xff0…

C语言——深入理解指针(2)

目录 一.数组名的理解 二. 使用指针访问数组 三. 一维数组传参的本质 四. 冒泡排序 五. 二级指针 六. 指针数组 七. 指针数组模拟二维数组 一.数组名的理解 在上⼀个章节我们在使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; 通过观察以上代码&#xf…

Html的<figure><figcaption>标签

Html的<figure><figcaption>标签 示例一: <figure><figcaption>figcaption001, fig标题1 </figcaption><figcaption>figcaption002, fig标题2 </figcaption><div style"width:calc(100px*2); height:calc(100px*2); back…

跨境云手机如何简化tiktok运营流程

如今&#xff0c;tiktok已经成为世界范围内都非常流行的社交媒体平台。然而在大多数情况下&#xff0c;由于网络原因&#xff0c;tiktok无法在国内使用&#xff0c;但依然有越来越多的人注册tiktok号码、建立tiktok矩阵。原因是tiktok仍然有大量的流量可供商业使用&#xff0c;…

如何在 Linux 中安装 s3cmd 并管理 Amazon s3 存储桶

S3&#xff0c; – 简单存储服务- 是亚马逊的存储服务&#xff0c;为 IT 团队提供一种安全、可扩展且可靠的方式来存储和检索云上的文件和文件夹。 S3 可确保数据在需要时可用并随着需求的增长而扩展&#xff0c;从而帮助您充分利用数据。 通常&#xff0c;在登录到您的 AWS 账…
推荐文章