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

在数据结构中,图(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.hqwc.cn/news/477939.html

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

相关文章

.ma1x0勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者: 数据安全问题备受关注。而勒索病毒是其中一种最为恶劣的威胁之一。其中,.ma1x0勒索病毒备受人们担忧,因其可将用户的数据文件加密,并要求支付赎金以解密文件。本文将介绍.ma1x0勒索病毒的特征、预防方法以及如何恢复…

stable diffusion官方版本复现

踩了一些坑,来记录下 环境 CentOS Linux release 7.5.1804 (Core) 服务器RTX 3090 复现流程 按照Stable Diffusion的readme下载模型权重、我下载的是stable-diffusion-v1-4 版本的 1 因为服务器没法上huggingface,所以得把权重下载到本地&#xff…

17.3.1.4 浮雕

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 浮雕的算法主要有以下两种: 1、相邻两个像素的红绿蓝颜色分量值差再加上一个常数。例如:从第二列像素开始&…

大白话说说redux

redux的3个重要概念 store 就是用来存放应用的各种状态的action 就是用来描述应用发生了什么动作的,注意理解他是对动作的描述reducer 就是用来处理应用的动作,并且决定怎么去更新应用存放在store里面的状态。 redux的3个原则 应用的所有状态存储为re…

K8s进阶之路-核心概念/架构:

架构:Master/Node Master组件--主控节点{ 负责集群管理(接收用户事件转化成任务分散到node节点上)} Apiserver: 资源操作的唯一入口,提供认证、授权、API注册和发现等机制 Scheduler : 负责集群资源调度&am…

【Larry】英语学习笔记语法篇——非谓语动词和从句是一回事

目录 非谓语动词和从句是一回事 不定式:名词/形容词/副词 1、不定式 名词属性的不定式:作为主语、表语、宾语 形容词属性的不定式:作后置定语 副词属性的不定式:作状语 副词属性的不定式:作插入语 不定式的逻辑…

【动态规划专栏】专题一:斐波那契数列模型--------2.三步问题

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

OpenAI发布Sora,另一个层次的黑科技

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【lesson62】网络通信UdpSocket版

文章目录 UdpSocketUdpServer.hppUdpServer类成员变量解释成员函数解释 UdpServer的实现ServerIinit的实现socketbindhtonsinet_addr具体实现 ServerStart的实现recvfromsendtontohsinet_ntoa具体实现 ~UdpServer函数实现UdpServer.hpp整体完整代码 UdpServer.ccUdpClient.ccTh…

Windows 重启 explorer 的正确做法

目录 一、关于 Restart Manager 二、重启管理器实例 三、完整实现代码和测试 本文属于原创文章,转载请注明出处: https://blog.csdn.net/qq_59075481/article/details/136179191。 我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者…

【软考中级备考笔记】计算机体系结构

计算机体系结构 2月19日 – 天气:阴转小雪 1. 冯诺依曼计算机体系结构 冯诺依曼将计算机分为了五大部分,分别是: 控制器:主要负责协调指令到执行运算器:负责算数和逻辑运算存储器:负责存储在指令执行过程…

自定义Linux登录自动提示语

设置提示语的方式 在Linux系统中,可以通过修改几个特定的文件来实现在用户登录时自动弹出提示语。以下是几个常用的方法: 1. 修改/etc/issue文件: 这个文件用于显示本地登录前的提示信息 sudo vi /etc/issue在项目合作的时候,…