所以我创建了一个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
答案 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()
,您可以轻松地调整此方法以执行深度优先搜索。