python中的图

news/2025/1/7 23:25:34/文章来源:https://www.cnblogs.com/lmc7/p/18656272

在 Python 中,图(Graph)是一个非常重要的数据结构,特别是在刷算法题时。图有许多类型(如有向图、无向图、有权图、无权图等),并且涉及的算法(如深度优先搜索、广度优先搜索、最短路径等)都非常常见。以下是 Python 中常见的图的语法,尤其是刷算法题时用到的技巧。

1. 图的基本定义

图通常由两部分组成:

  • 顶点(节点):图中的每个元素。
  • 边(连接顶点的线):连接两个顶点的关系。

Python 中表示图的方式有两种常见的方式:

  • 邻接矩阵:使用一个二维数组来表示图。
  • 邻接表:使用字典或列表来存储每个节点的相邻节点(边)。

1.1 邻接矩阵

邻接矩阵适用于存储密集图(边较多的图)。每个节点与其他节点之间的边存在于一个二维矩阵中,matrix[i][j] 为 1 表示有边从节点 i 到节点 j,为 0 则表示没有。

# 使用二维列表表示图
n = 5  # 图的顶点数量
graph = [[0] * n for _ in range(n)]# 假设图是无向图,添加边 (0, 1) 和 (1, 2)
graph[0][1] = 1
graph[1][0] = 1
graph[1][2] = 1
graph[2][1] = 1# 打印邻接矩阵
for row in graph:print(row)

1.2 邻接表

邻接表更适合稀疏图(边较少的图)。它使用一个字典或列表,键表示图的节点,值为该节点的所有相邻节点。

# 使用字典表示图
graph = {0: [1, 2],  # 0 节点与 1 和 2 相连1: [0, 2],  # 1 节点与 0 和 2 相连2: [0, 1],  # 2 节点与 0 和 1 相连3: [4],     # 3 节点与 4 相连4: [3]      # 4 节点与 3 相连
}# 打印邻接表
for node, neighbors in graph.items():print(f"Node {node}: {neighbors}")

2. 图的遍历:深度优先搜索 (DFS) 和广度优先搜索 (BFS)

在图算法中,遍历是常见的操作。常用的图遍历算法有 深度优先搜索(DFS)和 广度优先搜索(BFS)。

2.1 深度优先搜索 (DFS)

深度优先搜索是从一个节点开始,尽可能深入地访问每一个节点,直到没有未访问的邻居节点。DFS 可以使用递归或栈来实现。

递归实现 DFS

# 使用邻接表表示图
graph = {0: [1, 2],1: [0, 2],2: [0, 1],3: [4],4: [3]
}# 递归实现 DFS
def dfs(graph, node, visited):print(node, end=" ")visited.add(node)for neighbor in graph[node]:if neighbor not in visited:dfs(graph, neighbor, visited)visited = set()
dfs(graph, 0, visited)  # 从节点 0 开始 DFS

非递归实现 DFS(使用栈):

# 使用栈实现 DFS
def dfs_iterative(graph, start):visited = set()stack = [start]while stack:node = stack.pop()if node not in visited:visited.add(node)print(node, end=" ")for neighbor in graph[node]:if neighbor not in visited:stack.append(neighbor)dfs_iterative(graph, 0)  # 从节点 0 开始 DFS

2.2 广度优先搜索 (BFS)

广度优先搜索是从起始节点开始,依次访问离起始节点较近的节点,逐层扩展。BFS 通常使用队列来实现。

from collections import deque# 使用队列实现 BFS
def bfs(graph, start):visited = set()queue = deque([start])while queue:node = queue.popleft()if node not in visited:visited.add(node)print(node, end=" ")for neighbor in graph[node]:if neighbor not in visited:queue.append(neighbor)bfs(graph, 0)  # 从节点 0 开始 BFS

3. 常见图算法

3.1 最短路径算法

Dijkstra 算法(适用于有权图):
Dijkstra 算法用于寻找从起点到所有其他节点的最短路径,适用于图中的边权为正的情况。

import heapqdef dijkstra(graph, start):# 初始化最短路径dist = {node: float('inf') for node in graph}dist[start] = 0priority_queue = [(0, start)]  # (distance, node)while priority_queue:d, node = heapq.heappop(priority_queue)if d > dist[node]:continuefor neighbor, weight in graph[node]:distance = d + weightif distance < dist[neighbor]:dist[neighbor] = distanceheapq.heappush(priority_queue, (distance, neighbor))return dist# 使用邻接表表示图,图中的每个边是 (邻居, 权重)
graph = {0: [(1, 4), (2, 1)],1: [(2, 2), (3, 5)],2: [(3, 1)],3: []
}print(dijkstra(graph, 0))  # 从节点 0 开始计算最短路径

3.2 拓扑排序

拓扑排序用于有向无环图(DAG)。它可以找到一个节点的线性排列,使得每个节点的前驱节点都在其之前。

from collections import dequedef topological_sort(graph):# 计算每个节点的入度in_degree = {node: 0 for node in graph}for node in graph:for neighbor in graph[node]:in_degree[neighbor] += 1# 将入度为 0 的节点加入队列queue = deque([node for node in in_degree if in_degree[node] == 0])result = []while queue:node = queue.popleft()result.append(node)for neighbor in graph[node]:in_degree[neighbor] -= 1if in_degree[neighbor] == 0:queue.append(neighbor)return result# 使用邻接表表示图
graph = {0: [1, 2],1: [3],2: [3],3: []
}print(topological_sort(graph))  # 输出拓扑排序结果

3.3 判断图是否是二分图

如果一个图是二分图,那么我们可以将图中的节点分成两部分,使得每条边都连接两部分中的一个节点。可以使用 BFS 来判断图是否是二分图。

from collections import dequedef isBipartite(graph):color = {}def bfs(start):queue = deque([start])color[start] = 0  # 给起始节点上色while queue:node = queue.popleft()for neighbor in graph[node]:if neighbor not in color:color[neighbor] = 1 - color[node]  # 给邻居节点上相反的色queue.append(neighbor)elif color[neighbor] == color[node]:  # 如果邻居节点和当前节点同色,则不是二分图return Falsereturn Truefor node in graph:if node not in color:if not bfs(node):return Falsereturn True# 使用邻接表表示图
graph = {0: [1, 3],1: [0, 2],2: [1, 3],3: [0, 2]
}print(isBipartite(graph))  # 输出是否是二分图

4. 总结:

  • 图的表示: 使用邻接矩阵适用于密集图,使用邻接表适用于稀疏图。
  • 图的遍历: 深度优先搜索(DFS)和

广度优先搜索(BFS)是图算法的基础。

  • 常见算法: 最短路径(Dijkstra),拓扑排序,判断二分图等。
  • 图的相关问题: 包括连通性、最短路径、环检测等问题。

这些是刷图类算法题时常用的语法和技巧,理解这些基础知识对解决更复杂的图问题至关重要。

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

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

相关文章

基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真

1.课题概述 基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介自抗扰控制器(Active Disturbance Rejection Controller, ADRC)结合线性误差反馈控制律(Linear Error Feedback…

MediaWIKI 1.43 教程系列 4 — MediaWIKI 安装后的基本配置

1. 更改logo 将自己的logo 导入到 Mediawiki 的安装目录,即 /var/www/mediawiki/里面的 /resources/assets 然后修改 LocalSettings.php 文件内容,更改如下$wgLogos = [1x => "$wgResourceBasePath/resources/assets/mediawiki.png",icon => "$wgReso…

在iStoreOS上配置frpc客户端

摘自:https://www.koolcenter.com/posts/224 安装frpc,直接在iStoreOS商店找到全部软件。输入名称点新增:填写ip地址以及端口:web 配置看图:

中考英语优秀范文-010 The Spring Festival 春节

1 写作要求 近年来我国的发展世人瞩目,中国的传统文化正越来越受到各国朋友的关注。请根据提示,以 “The Spring Festival” 为题写一篇短文,向外国朋友介绍我国的春节。 要求: 1、字迹工整,规范; 2、 80词左右。 2 优秀范文 The Spring Festival In China, the Spring f…

FANUC机器人M-410iB/700电机断轴维修方法

发那科(FANUC)作为电机领域的领袖品牌,其伺服电机广泛应用于各种工业设备中,特别是在机床、自动化控制、机器人等领域。然而,即使是如此高品质的伺服电机,也难免会出现FANUC工业机械手电机故障,其中断轴故障是比较常见的一种。 一、法兰克机械手电机断轴故障原因分析 1.…

第四章 保护模式入门

本文是对《操作系统真象还原》第四章学习的笔记,欢迎大家一起交流。第四章 保护模式入门 本文是对《操作系统真象还原》第四章学习的笔记,欢迎大家一起交流。 知识部分 为什么要有保护模式? 实模式下安全问题:实模式下操作系统和用户程序属于同一特权级,平起平坐,没有区别…

FMC子卡设计原理图:FMC228-四路1.2Gsps 16bit DA FMC子卡

FMC子卡 , 高性能异构计算卡 , 雷达图像处理 , 模拟信号采集板卡 , 模拟信号输入FMC228-四路1.2Gsps 16bit DA FMC子卡 一、板卡概述FMC228 板卡可实现宽波段、四通道、16位、1.2Gsps(600Msps直接射频综合)DAC功能,时钟可采用内部时钟源(可选择锁定到外部参考),或外部提供…

FMC子卡设计原理图:165-2路万兆光纤SFP+ FMC子卡模块

2路万兆光纤SFP+ FMC子卡模块1. 概述  该板卡是基于kc705和ml605的fmc 10g万兆光纤扩展板设计。  SFP+(10 Gigabit Small Form Factor Pluggable)是一种可热插拔的,独立于通信协议的光学收发器,通常传输光的波长是 850nm, 1310nm 或1550nm,用于10G bps的SONET/SDH,光…

FMC子卡设计方案:127-4通道 12bit 125Msps 直流耦合 AD FMC 子卡

DA输出子卡 , FMC 子卡 , 中低频信号采集 , 模拟信号输入 , FL9627模块4通道 12bit 125Msps 直流耦合 AD FMC 子卡一、板卡概述:FMC 高速 AD 模块 FL9627 为 4 路 125MSPS, 12 位的模拟信号转数字信号模块。 FMC 模块的 AD 转换采用了 2 片 ADI 公司的 AD9627 芯片,每个 AD9…

跨时区协作:娱乐公司团队的全球化利器!

在线文档协作工具如何提升娱乐公司团队的创意效率? 在娱乐行业,创意是核心竞争力。无论是剧本创作、音乐制作,还是影视后期,团队协作的效率直接决定了项目的成败。而在线文档协作工具,正是提升这一效率的利器。今天,我们就从一个具体的点来发散——“实时协作”,看看它如…

tableau连接不上mysql或不显示mysql表的终极解决方法.220301

【报错一】连不上mysql An error occurred while communicating with MySQL The connection to the data source might have been lost. Error Code: 2868C972 The protocol is disconnected! Unable to connect to the MySQL server "*****". Check that the server…

Excel使用IF{1,0}虚拟数组+VLOOKUP实现联合查询.220507

以此案例举例:使用IF({1,0})建立虚拟数据的方法,整体输入的公式是: =VLOOKUP(E2&F2,IF({1,0},A:A&B:B,C:C),2,0) 输入完公式之后,需要按CTRL+shift+enter键 使用if({1,0},A:A&B:B,C:C)来构建了一个不需要辅助列的虚拟数组。 Excel 中ctrl+enter和ctrl+shift+en…