从原始边列表到邻接矩阵:使用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库来实现这一转换。邻接矩阵是图论和网络分析中的一个基础工具,对于理解和实现算法至关重要。以上示例为你提供了开始探索图的世界所需的基础知识。随着你对图论的进一步学习,你将发现还有许多其他形式的图表示法,每种都有其适用场景和优势。


目录
相关文章
|
6月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
412 1
|
6月前
|
开发者 Python
Python列表推导式:优雅与效率的完美结合
Python列表推导式:优雅与效率的完美结合
514 116
|
6月前
|
大数据 开发者 Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
451 109
|
6月前
|
Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
533 119
|
6月前
|
Python
Python列表推导式:优雅与效率的艺术
Python列表推导式:优雅与效率的艺术
382 99
|
6月前
|
数据处理 Python
解锁Python列表推导式:优雅与效率的完美融合
解锁Python列表推导式:优雅与效率的完美融合
408 99
|
6月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
533 95
|
6月前
|
Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
|
6月前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
294 1
|
6月前
|
索引 Python
098-python列表_切片_slice_开始_结束
本文介绍了Python中列表的切片(slice)操作,通过“前闭后开”原则截取列表片段,支持正负索引、省略端点等用法,并结合生活实例(如切面包、直播切片)帮助理解。切片不改变原列表,返回新列表。
394 4