从原始边列表到邻接矩阵:使用Python构建图的表示

简介: 从原始边列表到邻接矩阵:使用Python构建图的表示

图是一种非常强大的数据结构,用于表示对象(顶点)以及它们之间的关系(边)。在图论中,邻接矩阵是表示图的一种常用方式。一个邻接矩阵是一个二维数组,其中的元素表示图中任意两个顶点之间是否存在一条边。在本文中,我们将通过几个Python代码示例来演示如何将原始的边列表转换为邻接矩阵。


边列表理解


边列表是图的一种简单表现形式,它是顶点对的集合,每个对代表图中的一条边。例如,边列表 [(0, 1), (1, 2), (2, 0)] 表示一个三角形图。


转换为邻接矩阵


为了将边列表转换为邻接矩阵,我们需要执行以下步骤:

  1. 确定图中顶点的数量。
  2. 创建一个二维数组(列表),初始时没有边。
  3. 遍历边列表,对于每一条边,更新二维数组的相应元素。


示例1: 无权无向图的邻接矩阵

# 定义边列表
edges = [(0, 1), (1, 2), (2, 0), (1, 3)]

# 确定图中的最大顶点索引
num_nodes = max(max(edge) for edge in edges) + 1

# 创建邻接矩阵,初始化为0
adj_matrix = [[0 for _ in range(num_nodes)] for _ in range(num_nodes)]

# 填充邻接矩阵
for start, end in edges:
    adj_matrix[start][end] = 1
    adj_matrix[end][start] = 1  # 无向图是对称的

# 打印邻接矩阵
for row in adj_matrix:
    print(row)

示例2: 有权无向图的邻接矩阵

# 定义带权重的边列表
edges = [(0, 1, 10), (1, 2, 20), (2, 0, 30), (1, 3, 40)]

# 确定图中的最大顶点索引
num_nodes = max(max(start, end) for start, end, weight in edges) + 1

# 创建邻接矩阵,初始化为0
adj_matrix = [[0 for _ in range(num_nodes)] for _ in range(num_nodes)]

# 填充邻接矩阵
for start, end, weight in edges:
    adj_matrix[start][end] = weight
    adj_matrix[end][start] = weight  # 无向图是对称的

# 打印邻接矩阵
for row in adj_matrix:
    print(row)

示例3: 有向图的邻接矩阵

# 定义边列表
edges = [(0, 1), (1, 2), (2, 3), (3, 0)]

# 确定图中的最大顶点索引
num_nodes = max(max(edge) for edge in edges) + 1

# 创建邻接矩阵,初始化为0
adj_matrix = [[0 for _ in range(num_nodes)] for _ in range(num_nodes)]

# 填充邻接矩阵
for start, end in edges:
    adj_matrix[start][end] = 1  # 有向图不需要添加对称元素

# 打印邻接矩阵
for row in adj_matrix:
    print(row)

使用NumPy优化

如果你需要处理大型图或者想要一个更高级的数学处理方式,可以使用NumPy来创建和操作邻接矩阵。

import numpy as np

# 定义边列表
edges = [(0, 1), (1, 2), (2, 0), (1, 3)]

# 确定图中的最大顶点索引
num_nodes = max(max(edge) for edge in edges) + 1

# 创建邻接矩阵,初始化为0
adj_matrix = np.zeros((num_nodes, num_nodes), dtype=int)

# 填充邻接矩阵
for start, end in edges:
    adj_matrix[start, end] = 1
    adj_matrix[end, start] = 1  # 对于无向图

# 打印邻接矩阵
print(adj_matrix)


总结


将图的原始边列表表示形式转换为邻接矩阵是一个简单直接的过程。在Python中,可以通过基本的列表操作或者使用NumPy库来实现这一转换。邻接矩阵是图论和网络分析中的一个基础工具,对于理解和实现算法至关重要。以上示例为你提供了开始探索图的世界所需的基础知识。随着你对图论的进一步学习,你将发现还有许多其他形式的图表示法,每种都有其适用场景和优势。


目录
相关文章
|
11天前
|
索引 Python
Python列表
Python列表。
40 8
|
13天前
|
C语言 Python
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
本文介绍了Python的关键字列表及其使用规则。通过回顾`hello world`示例,解释了Python中的标识符命名规则,并探讨了关键字如`if`、`for`、`in`等不能作为变量名的原因。最后,通过`import keyword`和`print(keyword.kwlist)`展示了Python的所有关键字,并总结了关键字不能用作标识符的规则。
29 9
|
21天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
48 14
|
23天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
34 10
|
28天前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
28天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
70 3
|
2月前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
2月前
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
115 3
|
2月前
|
数据处理 开发者 Python
Python中的列表推导式:简洁高效的数据处理
在编程世界中,效率和可读性是代码的两大支柱。Python语言以其独特的简洁性和强大的表达力,为开发者提供了众多优雅的解决方案,其中列表推导式便是一个闪耀的例子。本文将深入探讨列表推导式的使用场景、语法结构及其背后的执行逻辑,带你领略这一特性的魅力所在。
|
2月前
|
存储 API 数据库
使用Python和Flask构建简单的RESTful API
使用Python和Flask构建简单的RESTful API