广度首先搜索邻接矩阵

时间:2017-04-12 16:58:40

标签: python breadth-first-search adjacency-list adjacency-matrix

所以我创建了一个bfs遍历,它消耗了一个图形和一个起始点。它使用相邻列表中表示的图形但是如何更改它以使用邻接矩阵。我只是需要一个地方开始

邻接清单:

{0:[1,2,3],1:[0,2,3],2:[0,1,4],3:[0,1],4:[2]}

邻接矩阵:

[ [0,1,1,1,0], 
  [1,0,1,1,0], 
  [1,1,0,0,1], 
  [1,1,0,0,0], 
  [0,0,1,0,0] ]
def bfs(graph, v):
  all = []
  Q = []
  Q.append(v)
  while Q != []:
    v = Q.pop(0)
    all.append(v)
    for n in graph[v]:
      if n not in Q and\
      n not in all:
      Q.append(n)
  return all

2 个答案:

答案 0 :(得分:1)

我有一次类似的问题,我认为将矩阵转换为邻接列表是最简单的,例如:

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

然后,您可以使用规范(和调试)的广度优先搜索算法和返回的节点列表。我希望有帮助

答案 1 :(得分:0)

我提供此提交内容是为了帮助遇到此问题的任何人。虽然BFS的算法是众所周知的,但我发现出乎意料的困难是,您很难在问题矩阵中找到在邻接矩阵(NOT列表)上找到BFS或DFS的Python实现。

下面的实现适用于您的矩阵,如下所示。它迭代地运行,并且由于它一次访问矩阵中的每个单元,因此它的运行时间为O(n * m),其中n = matrix.length,m = matrix [0] .length。在平方矩阵上,应该是时间O(n ^ 2)。

def bfs(matrix, row, col, visited):
    nodes = [(row, col)]
    while nodes:
        row, col = nodes.pop(0)
        # the below conditional ensures that our algorithm 
        #stays within the bounds of our matrix.
        if row >= len(matrix) or col >= len(matrix[0]) or row < 0 or col < 0:
            continue
        if (row, col) not in visited:
            if matrix[row][col] == 1:
                visited.append((row, col))
                nodes.append((row+1, col))
                nodes.append((row, col+1))
                nodes.append((row-1, col))
                nodes.append((row, col-1))

def bfs_wrapper(matrix):
    visited = []
    for i in range(len(matrix)):
        for j in range(len(matrix[0])):
            if (i,j) not in visited:
                bfs(matrix, i, j, visited)
            
    return visited

它返回以下内容(这是一个元组列表,其中包含矩阵中标记为1的单元格的行和列坐标):

[(0, 1), (0, 2), (1, 2), (0, 3), (1, 3), (1, 0), (2, 0), (3, 0), (2, 1), (3, 1), (2, 4), (4, 2)]

通过将nodes.pop(0)修改为nodes.pop(),您可以轻松地调整此方法以执行深度优先搜索。