【问题标题】:printing all the edges of a graph in an adjacency matrix in python在python的邻接矩阵中打印图的所有边
【发布时间】:2018-12-30 13:36:47
【问题描述】:

如何在 python 中打印具有给定邻接矩阵的图的所有边?例如,如果 0 与 3 和 8 相邻,则应打印: 0 3 0 8 不重复 我一直在使用 Bfs,但我不知道如何更新队列和当前元素。

这是我目前的代码

A =  [[0, 1, 0, 0, 0, 1], 
      [1, 0, 0, 0, 0, 1], 
      [0, 0, 0, 1, 1, 0], 
      [0, 0, 0, 0, 1, 0],
      [0, 0, 0, 0, 0, 0],
      [1, 0, 0, 0, 0, 0]]

def edges(A):
    visited = [False] * len(A)
    queue = []

    s = [0][0]
    queue.append(s)
    visited[s] = True

    while len(queue) > 0:
        s = queue.pop(0)
        print(s)
        for i in range(len(A)):
            print(i)

            for j in range(len(A[0])):
                if A[i][j] == 1 and visited[s]== False:

                    queue.append([i][j])

                    visited[s] = True

print(edges(A))

【问题讨论】:

标签: python networkx graph-theory breadth-first-search


【解决方案1】:

如果我理解正确,并且您的示例矩阵 A 是不对称的,您可以这样做:

A =  [[0, 1, 0, 0, 0, 1],
      [1, 0, 0, 0, 0, 1],
      [0, 0, 0, 1, 1, 0],
      [0, 0, 0, 0, 1, 0],
      [0, 0, 0, 0, 0, 0],
      [1, 0, 0, 0, 0, 0]]

def edges(adj):

    for i, neighbors in enumerate(adj):
        for j, v in enumerate(neighbors):
            if v:
                yield (i, j)


for edge in edges(A):
    print(edge)

输出

(0, 1)
(0, 5)
(1, 0)
(1, 5)
(2, 3)
(2, 4)
(3, 4)
(5, 0)

【讨论】:

  • 是的,这是正确的,但是有没有办法使用普通的 bfs 技术打印相同的输出。我的意思是使用队列和探索的数组?谢谢顺便说一句
【解决方案2】:

一种简单的方法是遍历邻接矩阵,并在存在连接的地方构建一个带有索引的元组列表:

[(i,j) for i,l in enumerate(A) for j,v in enumerate(l) if v]
# [(0, 1), (0, 5), (1, 0), (1, 5), (2, 3), (2, 4), (3, 4), (5, 0)]

但是,您可以使用networkx 轻松完成此操作。您可以使用from_numpy_matrix 从邻接矩阵创建图,并使用edges 打印带有边的列表:

A =  np.array([[0, 1, 0, 0, 0, 1], 
               [1, 0, 0, 0, 0, 1], 
               [0, 0, 0, 1, 1, 0], 
               [0, 0, 0, 0, 1, 0],
               [0, 0, 0, 0, 0, 0],
               [1, 0, 0, 0, 0, 0]])

import networkx as nx
g = nx.from_numpy_matrix(A, create_using=nx.DiGraph)
g.edges()
# OutEdgeView([(0, 1), (0, 5), (1, 0), (1, 5), (2, 3), (2, 4), (3, 4), (5, 0)])

【讨论】:

  • 感谢您的回复,但不使用 networkx 怎么能做到这一点
【解决方案3】:

您可以将矩阵转换为邻接列表,然后打印出节点和连接边:

A = [
    [0, 1, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 1],
    [0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 1, 0],
    [0, 0, 0, 0, 0, 0],
    [1, 0, 0, 0, 0, 0],
]


def matrix_to_list(matrix):
    """Convert adjacency matrix to adjacency list"""
    graph = {}
    for i, node in enumerate(matrix):
        adj = []
        for j, connected in enumerate(node):
            if connected:
                adj.append(j)
        graph[i] = adj
    return graph


adjacency_list = matrix_to_list(A)
print(adjacency_list)
# {0: [1, 5], 1: [0, 5], 2: [3, 4], 3: [4], 4: [], 5: [0]}


connected_edges = [
    (node, edge) for node, edges in adjacency_list.items() for edge in edges
]
print(connected_edges)
# [(0, 1), (0, 5), (1, 0), (1, 5), (2, 3), (2, 4), (3, 4), (5, 0)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2022-07-10
    相关资源
    最近更新 更多