即使我知道自己做错了什么,我也在努力研究如何有效地实现这一目标。我试图让我的代码读取邻接列表,例如一个无向的加权图:
[(1,5)],[(0,5),(2,7)],[(1,7)]
然后将其转换为邻接矩阵,它将返回:
[0,5,inf],[5,0,7],[inf,7,0]
然而,下面的代码返回[0,5,inf],[5,inf,0,inf,7],[inf,7,0],我知道为什么会这样。但是,我只想附加' inf'在[0,5,inf]之类的情况下,邻接矩阵因为0与2不相邻,因此其权重为“inf”。什么是最好的解决方案?
def adjacency_matrix(graph_string):
adj_list = adjacency_list(graph_string)
n = len(adj_list)
adj_mat = [[] for _ in range(n)]
for i in range(n):
for j in range(n):
if j == i:
adj_mat[i].append(0)
else:
for neighbour, weight in adj_list[i]:
if j == neighbour:
adj_mat[i].append(weight)
break
elif j != neighbour:
adj_mat[i].append(float('inf'))
return adj_mat
答案 0 :(得分:0)
问题似乎出现在elif
部分
elif j != neighbour:
adj_mat[i].append(float('inf'))
因为你只想填补inf
的缺失边缘。如果您的elif j < neighbour
已排序,则使用条件adj_list
将是正确的。
然而,更好的解决方案是在其他地方初始化零对角线和inf
值的邻接矩阵。并且只填充邻接列表中的权重。这样你就可以避免考虑非边缘。
以下是一个简短的示例,说明如何使用numpy
实现。
import numpy as np
def adj_list_to_matrix(adj_list):
n = len(adj_list)
adj_matrix = np.nan * np.ones((n,n))
np.fill_diagonal(adj_matrix,0)
for i in range(n):
for j, w in adj_list[i]:
adj_matrix[i,j] = w
return adj_matrix
用法:
adj_list = [(1,5)], [(0,5), (2,7)], [(1,7)]
adj_list_to_matrix(adj_list)