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

本文介绍了如何将边列表转换为邻接矩阵,包括无权无向图、有权无向图和有向图的Python代码示例,以及使用NumPy库进行优化。这是图论基础知识的重要应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图是一种非常强大的数据结构,用于表示对象(顶点)以及它们之间的关系(边)。在图论中,邻接矩阵是表示图的一种常用方式。一个邻接矩阵是一个二维数组,其中的元素表示图中任意两个顶点之间是否存在一条边。在本文中,我们将通过几个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, 
### 使用邻接矩阵计算无向的可达性矩阵 对于无向而言,其邻接矩阵 \( A \) 是一个对称矩阵,在该矩阵中如果存在一条连接节点 \( i \) 和节点 \( j \) 的边,则 \( A_{ij} = A_{ji} = 1 \),否则这两个位置上的值都为 0。为了得到无向的可达性矩阵,可以利用 Warshall 算法的一个简化版本来实现。 由于无向的特点使得任何两点间的路径都是双向可达的,因此不需要像处理有向那样复杂地追踪方向。具体做法如下: 可以直接基于原始邻接矩阵进行幂运算直到不再发生变化为止。当执行到第 \( n-1 \) 次方时(\( n \) 表示顶点数目),此时所获得的结果就是最终的可达性矩阵[^1]。这是因为根据矩阵乘法规则,每次相乘实际上是在寻找长度增加一倍的新路径集合,并且这些新发现的路径会被累积起来形成更广泛的连通情况描述。 另外一种方式是应用 Floyd-Warshall 算法的思想,不过因为是对称的关系,所以在更新过程中只需关注上三角部分即可完成整个过程。这同样能够有效地构建出完整的可达性信息表单[^3]。 ```python def calculate_reachability_matrix(adjacency_matrix): """ 计算给定无向邻接矩阵对应的可达性矩阵 参数: adjacency_matrix (list of list): 输入的无向邻接矩阵 返回: reachability_matrix (list of list): 输出的可达性矩阵 """ num_vertices = len(adjacency_matrix) # 初始化可达性矩阵等于输入的邻接矩阵 reachability_matrix = [[adjacency_matrix[i][j] for j in range(num_vertices)] for i in range(num_vertices)] # 进行迭代更新以填充所有可能存在的间接路径 for k in range(num_vertices): for i in range(k, num_vertices): for j in range(i, num_vertices): if not reachability_matrix[i][j]: reachability_matrix[i][j] |= reachability_matrix[i][k] and reachability_matrix[k][j] reachability_matrix[j][i] = reachability_matrix[i][j] return reachability_matrix ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值