Python 实现图:构建、添加和搜索详解

在本篇文章中,我们将一起探讨如何在 Python 中实现图的数据结构。图是一种非常灵活的数据结构,它能够表示复杂的关系,比如社交网络、道路网络等。在本篇文章中,我们会实现一个简单的图,并支持添加顶点、添加边以及使用深度优先搜索 (DFS) 和广度优先搜索 (BFS) 两种常见的图遍历方法。

什么是图?

图 (Graph) 是一种由顶点 (vertices) 和边 (edges) 组成的数据结构,用于表示实体之间的关系。在图中,顶点是代表的实体,而边是这些实体之间的关系。根据边的方向性,图可以分为有向图和无向图。无向图中的边没有方向,而有向图中的边有方向。

图的代码实现

下面是使用 Python 实现的一个简单图结构。图由一个类 Graph 来实现,包含了各种操作方法,例如添加顶点、添加边以及对图进行遍历。

class Graph:def __init__(self):self.graph = dict()def add_vertex(self, vertex):""" 添加一个顶点到图中 """if vertex not in self.graph:self.graph[vertex] = []def add_edge(self, vertex1, vertex2):""" 添加一条无向边(vertex1 - vertex2) """if vertex1 not in self.graph:self.add_vertex(vertex1)if vertex2 not in self.graph:self.add_vertex(vertex2)self.graph[vertex1].append(vertex2)self.graph[vertex2].append(vertex1)def add_directed_edge(self, start, end):"""添加一条有向边(start -> end)"""if start not in self.graph:self.add_vertex(start)if end not in self.graph:self.add_vertex(end)self.graph[start].append(end)def dfs(self, start, visited=None):""" 深度优先搜索 """if visited is None:visited = set()visited.add(start)print(start, end=" ")for neighbor in self.graph[start]:if neighbor not in visited:self.dfs(neighbor, visited)def bfs(self, start):""" 广度优先搜索 """visited = set()queue = [start]visited.add(start)while queue:vertex = queue.pop(0)print(vertex, end=" ")for neighbor in self.graph[vertex]:if neighbor not in visited:visited.add(neighbor)queue.append(neighbor)

1. Graph 类

Graph 类是整个图的管理类,用于创建图结构,包含顶点和边。它提供了一些常见的图操作,如添加顶点、添加边、深度优先搜索 (DFS) 和广度优先搜索 (BFS) 方法。

__init__ 方法

Graph 类的初始化方法中,我们使用一个字典 (dict) 来存储图的结构。字典的键是顶点,值是与该顶点相连的其他顶点的列表。

add_vertex 方法:添加顶点

add_vertex 方法用于向图中添加新的顶点。

  • 如果顶点不在图中,则将其添加为键,并将值初始化为空列表,表示还没有相邻的顶点。
add_edge 方法:添加无向边

add_edge 方法用于在两个顶点之间添加一条无向边。

  • 首先确保两个顶点都已经存在于图中,如果不存在则调用 add_vertex 方法将其添加。
  • 然后,在两个顶点之间互相添加对方到各自的邻接列表中,表示它们之间存在无向连接。
add_directed_edge 方法:添加有向边

add_directed_edge 方法用于在两个顶点之间添加一条有向边。

  • 该方法与 add_edge 类似,不同之处在于它只在起点 (start) 的邻接列表中添加终点 (end),表示有一个方向的连接。

2. 图的遍历方法

图的遍历包括深度优先搜索 (DFS) 和广度优先搜索 (BFS),它们用于访问图中的所有节点。

dfs 方法:深度优先搜索

深度优先搜索 (DFS) 是一种遍历图的方法,先访问一个节点,然后再递归地访问它的所有相邻节点。

  • 如果节点还没有被访问过,就将其标记为已访问 (visited 集合),并递归调用 dfs 访问所有相邻节点。
  • 这种遍历方式类似于树的前序遍历。
bfs 方法:广度优先搜索

广度优先搜索 (BFS) 是另一种遍历图的方法,它按层次来访问图中的节点。

  • 首先将起始节点添加到队列中,并将其标记为已访问。
  • 依次从队列中取出节点,访问该节点的所有相邻节点,并将未访问过的节点加入队列中。
  • 这种遍历方式类似于按层访问树的节点。

示例演示

下面通过一个简单的示例来展示如何使用这些方法创建图并进行遍历:

if __name__ == "__main__":graph = Graph()graph.add_vertex(1)graph.add_vertex(2)graph.add_edge(1, 2)graph.add_edge(1, 3)graph.add_directed_edge(2, 4)graph.add_directed_edge(3, 5)print("深度优先搜索 (DFS):")graph.dfs(1)  # 输出:1 2 4 3 5print("\n广度优先搜索 (BFS):")graph.bfs(1)  # 输出:1 2 3 4 5

在上面的代码中,我们创建了一个简单的图,并在其上添加了一些顶点和边。然后,我们分别使用深度优先搜索 (DFS) 和广度优先搜索 (BFS) 方法来访问图中的所有节点。

结论

在本篇文章中,我们实现了一个简单的图,并展示了如何添加顶点和边,以及如何使用深度优先搜索 (DFS) 和广度优先搜索 (BFS) 方法遍历图。通过这些基本操作,我们可以构建出复杂的网络结构,并轻松访问它们的所有节点。

如果你对图的实现或图算法有任何疑问或者想要讨论的内容,欢迎在评论区留言讨论!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

移远通信推出全星系多频段高精度定位定向GNSS模组LG580P,引领高精度导航新时代

近日,全球领先的物联网整体解决方案供应商移远通信宣布,正式发布其全星系多频段高精度GNSS模组LG580P。该模组具备高精度、高稳定性、低功耗等特点,并支持20Hz RTK Heading 更新频率,为智能机器人、精准农业、测量测绘、自动驾驶…

Python设计模式探究:单例模式实现及应用解析

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

企业微信会话存档引用com.tencent.wework.Finance出错?

报错: 会话存档引用com.tencent.wework.Finance出错,找不到该类,报错如下:java.lang.NoClassDefFoundError: Could not initialize class com.tencent.wework.Finance 这个问题怎么解决? 解决方案:需要下载…

【前端基础】盒子模型

目标&#xff1a;掌握盒子模型组成部分&#xff0c;使用盒子模型布局网页区域 01-选择器 结构伪类选择器 基本使用 作用&#xff1a;根据元素的结构关系查找元素。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

鸿蒙开发:ArkUI Toggle 组件

ArkUI提供了一套完整的UI开发工具集&#xff0c;帮助开发者高效完成页面的开发。它融合了语言、编译器、图形构建等关键的应用UI开发底座&#xff0c;为应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能以及实时界面预览工具等&#xff0c;可以支持…

【LeetCode每日一题】——802.找到最终的安全状态

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 图 二【题目难度】 中等 三【题目编号】 802.找到最终的安全状态 四【题目描述】 有一个有…

安利一款开源企业级的报表系统SpringReport

SpringReport是一款企业级的报表系统&#xff0c;支持在线设计报表&#xff0c;并绑定动态数据源&#xff0c;无需写代码即可快速生成想要的报表&#xff0c;可以支持excel报表和word报表两种格式&#xff0c;同时还可以支持excel多人协同编辑&#xff0c;后续考虑实现大屏设计…

考公人数攀升?地信、测绘、地质、遥感等专业,能报考哪些单位

近年来&#xff0c;考公人数持续飙升&#xff0c;国考报名人数更逐年攀升。2025年国家公务员考试共有341.6万人通过资格审查&#xff0c;报录比达86:1。国考报名人数再创新高。 国家公务员考试时间安排 地理学相关岗位分析 地信属于地理科学类&#xff0c;测绘类中不包括地信&…

LabVIEW 离心泵机组故障诊断系统

开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法&#xff0c;通过远程在线监测与分析&#xff0c;有效提升了离心泵的预测性维护能力&#xff0c;保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…

YOLOv10改进策略【卷积层】| CVPR-2023 SCConv 空间和通道重建卷积:即插即用,减少冗余计算并提升特征学习

一、本文介绍 本文记录的是利用ScConv优化YOLOv10的目标检测网络模型。深度神经网络中存在大量冗余&#xff0c;不仅在密集模型参数中&#xff0c;而且在特征图的空间和通道维度中。ScConv模块通过联合减少卷积层中空间和通道的冗余&#xff0c;有效地限制了特征冗余&#xff…

Linux 文件系统权限

文件的一般权限 文件详细信息 使用命令 ll 或 ls -l 查看 文件权限构成 权限针对三类对象定义 owner &#xff1a;所有者&#xff0c;缩写 u group &#xff1a;所属组&#xff0c;缩写 g other &#xff1a;其他人&#xff0c;缩写 o 访问者三种权限 组成模式分析 …

C++上机实验|多态性编程练习

1.实验目的 (1)理解多态性的概念。 (2)掌握如何用虚函数实现动态联编 (3)掌握如何利用虚基类。 2.实验内容 设计一个飞机类 plane,由它派生出歼击机类fighter和轰炸机类 bomber,歼击机类fighter 和轰炸机类bomber 又共同派生出歼轰机(多用途战斗机)。利用虚函数和虚基类描述…

学习threejs,使用对象组合

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Object3D 三维物体 二…

遇到的问题

刚遇到的问题&#xff1a; 一直以为这个图片数据结构是以下这种&#xff1a; {"descrlong1": [{"CL04": "人力违纪"},{"CL05": "其他"}], }其实数据结构是&#xff1a; {"descrlong1": [{"key": &quo…

发现8个高风险漏洞 NVIDIA GeForce用户必须更新GPU驱动程序

所有NVIDIA GeForce图形处理器都面临着高风险&#xff0c;因为该公司在其图形处理器驱动程序中发现了几个漏洞&#xff0c;这些漏洞可能会让黑客利用你的系统。公司敦促用户更新到最新的GeForce显示屏和VGPU驱动程序&#xff0c;以确保他们的系统不受任何漏洞的影响。 NVIDIA在…

Redis 中 Bitmap 原理和应用

Bitmap Redis中的Bitmap&#xff08;位图&#xff09;是一种较为特殊数据类型&#xff0c;它以最小单位bit来存储数据&#xff0c;我们知道一个字节由 8个 bit 组成&#xff0c;和传统数据结构用字节存储相比&#xff0c;这使得它在处理大量二值状态&#xff08;true、false 或…

微信小程序开发,诗词鉴赏app

文章目录 1. 项目功能思维导图2. 项目涉及到的技术点3. 开发环境4. 项目运行效果5. 部分功能实现6. 关于本人其它项目的介绍 1. 项目功能思维导图 2. 项目涉及到的技术点 使用MySQL数据库实现数据存储使用setInterval实现启动页3s倒计时使用storage实现数据持久化存储&#xf…

什么是阿里云上的主机安全服务?

在数字化时代&#xff0c;数据安全和网络安全成为了企业最关心的问题之一。随着越来越多的企业将业务迁移至云端&#xff0c;如何确保云环境的安全性&#xff0c;成为了企业必须面对的重要挑战。阿里云安全中心&#xff08;SAS&#xff09;作为一款全面的云安全解决方案&#x…

在K8s平台部署个人博客

在K8s平台部署个人博客 实验步骤查看wordpress前端的service配置word press 实验步骤 kubectl create secret generic mysql-pass --from-literalpasswordYOUR_PASSWORD把mysql.tar.gz和wordpress.tar.gz上传到K8s工作节点&#xff0c;手动解压即可&#xff1a; 通过网盘分享的…

【原创】java+ssm+mysql收纳培训网系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…