邻接矩阵是一种表示图的数据结构,其中矩阵的行和列分别代表图中的顶点,矩阵中的元素表示两个顶点之间的连接关系。如果顶点 i 和顶点 j 之间有边,则矩阵的第 i 行第 j 列的元素为 1(或边的权重),否则为 0。
邻接表是另一种表示图的数据结构,它为每个顶点维护一个列表,列表中包含所有与该顶点相邻的顶点及其边的权重。
将邻接矩阵转换为邻接表的过程如下:
以下是一个 Python 示例代码,展示如何将邻接矩阵转换为邻接表:
def adjacency_matrix_to_list(matrix):
n = len(matrix) # 图的顶点数
adj_list = [] # 初始化邻接表
for i in range(n):
vertex_adj = [] # 当前顶点的邻接列表
for j in range(n):
if matrix[i][j] != 0:
vertex_adj.append({"vertex": j, "weight": matrix[i][j]})
adj_list.append(vertex_adj)
return adj_list
# 示例邻接矩阵
adj_matrix = [
[0, 1, 0, 2],
[1, 0, 3, 0],
[0, 3, 0, 4],
[2, 0, 4, 0]
]
# 转换为邻接表
adj_list = adjacency_matrix_to_list(adj_matrix)
print(adj_list)
[
[{'vertex': 1, 'weight': 1}, {'vertex': 3, 'weight': 2}],
[{'vertex': 0, 'weight': 1}, {'vertex': 2, 'weight': 3}],
[{'vertex': 1, 'weight': 3}, {'vertex': 3, 'weight': 4}],
[{'vertex': 0, 'weight': 2}, {'vertex': 2, 'weight': 4}]
]
问题:在转换过程中,可能会遇到矩阵元素为负数或非数字的情况。
原因:这可能是由于输入数据不正确或矩阵表示有误。
解决方法:在转换之前,检查矩阵中的每个元素是否为有效的边权重(通常是正数或 0)。如果不是,可以抛出异常或进行相应的处理。
def adjacency_matrix_to_list(matrix):
n = len(matrix)
adj_list = []
for i in range(n):
vertex_adj = []
for j in range(n):
if not isinstance(matrix[i][j], (int, float)) or matrix[i][j] < 0:
raise ValueError(f"Invalid weight at position ({i}, {j}): {matrix[i][j]}")
if matrix[i][j] != 0:
vertex_adj.append({"vertex": j, "weight": matrix[i][j]})
adj_list.append(vertex_adj)
return adj_list
通过这种方式,可以确保转换过程的正确性和鲁棒性。