【问题标题】:Correctly changing the values of an adjacency matrix to represent an undirect graph正确更改邻接矩阵的值以表示无向图
【发布时间】:2018-06-02 18:49:11
【问题描述】:

我正在尝试解决有关图表的问题。但是,当我尝试构建邻接矩阵时,发生了一个非常奇怪的错误。

这是任务:

这是一个简单的复制/粘贴格式的输入:

4 4
1 2
3 2
4 3
1 4
1 4

这些是到目前为止我试图解决问题的步骤:

  1. 读取输入数据
  2. 使边像两个顶点的一对(元组),例如,(v1, v2) 表示在顶点 1 和 2 之间有一条边。
  3. 基于“n”个边,我创建了一个“nxn”二次矩阵。我将所有项目都填写为 0。在下一步中,如果顶点之间存在连接,我尝试将“0”更改为“1”。

    观察:我创建了两个函数。一个创建一个要填充的邻接矩阵。另一个名为 fill_matrix 的名称是在适当的时候将零 (0) 更改为一 (1)。

  4. 现在是问题出现的地方。我试图迭代我的​​边缘并更改邻接矩阵。

然而,奇怪的事情发生了。相同的函数,具有相同的参数,提供不同的输出。我真的不明白为什么会这样!

这是我目前的代码:

#Uses python3

import sys

input = sys.stdin.read()
#print ("input", input)

data = list(map (int, input.split()))
#print ("data", data)

nodes_num = data[0]
#print ("number of nodes", nodes_num)

edges_num = data[1]
#print ("number of edges", edges_num)

data = data[2:]
#print ("data withou initial numbers", data)

vertex_start = data[-2]
#print ("initial node", vertex_start)

vertex_end = data[-1]
#print ("final node", vertex_end)

data_edges = data[0:len(data)-2]
#print ("list with the relation of the edges", data_edges)

# this function cnverts the list of edges in appropriate pairs as tupples
def make_edge_pairs(edges_list):

    edges_list_even = edges_list[::2]
    edges_list_odd = edges_list[1::2]
    # using zip function to interlacte odds and events as proper pairs
    edges_tuples_objects = zip(edges_list_even,edges_list_odd)
    edges_list_tuplas = [ ]

    for pair in edges_tuples_objects:

        edges_list_tuplas.append(pair)

    return edges_list_tuplas

def create_adjacency_matrix(vertex_num):

    adj_matrix = []
    lines_list = []

    for i in range(0,vertex_num):

        lines_list.append(0)

    for j in range(0,vertex_num):
        adj_matrix.append(lines_list)

    return adj_matrix

matriz_adj = create_adjacency_matrix(nodes_num)
print ("matriz adj",matriz_adj)

in_case_edges_list = make_edge_pairs(data_edges)
print ("in_case_edges_list", in_case_edges_list)

edges_list = [(1, 2), (3, 2), (4, 3), (1, 4)]
print ("edges_list", edges_list)

matrix_to_be_fill = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
print("matrix_to_be_fill",matrix_to_be_fill)

print(matrix_to_be_fill==matriz_adj)
print (edges_list==in_case_edges_list)

def fill_matrix(matrix, edges_list):

    #print (matrix, edges_list)

    for tupla in edges_list:
       lin = (tupla[0]) - 1
       col = (tupla[1]) - 1
       matrix[lin][col] = 1
       matrix[col][lin] = 1
    return matrix

print (fill_matrix(matriz_adj,in_case_edges_list))
print (fill_matrix(matrix_to_be_fill,in_case_edges_list))

这段摘录保证输入是相同的,因为两者都返回 True:

print(matrix_to_be_fill==matriz_adj)
print (edges_list==in_case_edges_list)

但是,具有相同输出的函数返回不同的输出:

print (fill_matrix(matriz_adj,in_case_edges_list))
print (fill_matrix(matrix_to_be_fill,in_case_edges_list))

我希望这个列表作为两种情况下的输出:

[[0, 1, 0, 1],
 [1, 0, 1, 0],
 [0, 1, 0, 1],
 [1, 0, 1, 0]]

这是顶点之间关系的正确表示!

我知道在 Python 中还有其他表示顶点和边之间关系的形式。但我想解决这个问题并继续研究这种方法。

我运行代码:

python3 reachability.py < sample_1.txt

sample_1.txt 文件只有我之前显示的输入。

【问题讨论】:

    标签: python python-3.x graph-theory adjacency-matrix


    【解决方案1】:

    问题是每一行都是同一个列表:

    def create_adjacency_matrix(vertex_num):
    
        adj_matrix = []
        lines_list = []
    
        for i in range(0,vertex_num):
    
            lines_list.append(0)
    
        for j in range(0,vertex_num):
            adj_matrix.append(lines_list)
    
        return adj_matrix
    

    adj_matrix.append(lines_list) 更改为adj_matrix.append(lines_list[:])

    或者写成:

    def create_adjacency_matrix(vertex_num):
    
        adj_matrix = []
    
        for j in range(0,vertex_num):
            lines_list = []
    
            for i in range(0,vertex_num):
                lines_list.append(0)
    
            adj_matrix.append(lines_list)
    
        return adj_matrix
    

    【讨论】:

    • 谢谢。我没有 C 语言背景。我很难看到这个错误。你有 C 的背景吗?您认为这是促使您了解如何解决问题的主要诱因吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多