正确更改邻接矩阵的值以表示间接图

时间:2018-06-02 18:49:12

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

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

这是任务: enter image description here

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

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. 现在出现问题。我试图迭代我的​​边缘并改变邻接矩阵。

  5. 然而,一件奇怪的事情发生了。具有相同参数的相同功能提供不同的输出。我真的不明白为什么会发生这种情况!

    到目前为止,这是我的代码:

    #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只有我之前显示的输入。

1 个答案:

答案 0 :(得分: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