问题描述
我正在尝试使用字典进行深度优先搜索,其中键是将要访问的下一个节点,值是前任节点,但有些地方不太正确。到目前为止,我有:
from collections import deque
class Graph:
def __init__(self,n):
self.adj = {}
for i in range(n):
self.adj[i] = []
def are_connected(self,node1,node2):
return node2 in self.adj[node1]
def adjacent_nodes(self,node):
return self.adj[node]
def add_node(self):
self.adj[len(self.adj)] = []
def add_edge(self,node2):
if node1 not in self.adj[node2]:
self.adj[node1].append(node2)
self.adj[node2].append(node1)
def number_of_nodes():
return len()
def DFS(G,node1):
S = [node1]
marked = {}
pred = {}
for node in G.adj:
marked[node] = False
while len(S) != 0:
current_node = S.pop()
if not marked[current_node]:
marked[current_node] = True
for node in G.adj[current_node]:
# if node == node2:
# return True
S.append(node)
if not marked[node]:
pred[node] = current_node
pred[current_node] = node
return pred
当我打电话时:
G = Graph(20)
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,4)
G.add_edge(0,1)
G.add_edge(4,5)
G.add_edge(5,6)
G.add_edge(6,7)
G.add_edge(4,6)
G.add_edge(2,6)
G.add_edge(8,9)
G.add_edge(10,3)
G.add_edge(2,3)
print(DFS(G,1))
我得到 {0: 1,6: 2,10: 3,1: 6}
但这不可能是正确的,因为 G 中有许多节点甚至没有被访问过,而且我不太清楚问题是什么。任何帮助表示赞赏!
解决方法
您将 if not marked[node]
条件放在错误的位置。
def DFS(G,node1):
S = [node1]
marked = {}
pred = {}
for node in G.adj:
marked[node] = False
while len(S) != 0:
current_node = S.pop()
if not marked[current_node]:
marked[current_node] = True
for node in G.adj[current_node]:
# if node == node2:
# return True
S.append(node)
if not marked[node]:
pred[node] = current_node
pred[current_node] = node
return pred
输出将是:{2: 1,0: 1,3: 4,6: 2,5: 4,7: 6,4: 6,10: 3,1: 6}
这是您期望的吗?
,1:您想从 DFS 函数返回的字典无法显示。假设我们有两条到节点 1 的路径,分别是节点 0 和节点 2,如果我们得到 {1:2},那么 {1:0} 将替换 {1:2},你可能会丢失一些节点路径。>
2:要进行深度优先搜索,我们需要“走到最后”。函数中的数组 S 进行循环,但首先使广度。
我使用递归函数来修改你的代码:
def DFS(G,node1,marked = []):
S = [node1]
pred = []
while len(S) != 0:
current_node = S.pop()
if current_node not in marked:
marked.append(current_node)
pred.append(current_node)
for node in G.adj[current_node]:
# if node == node2:
# return True
pred.extend(DFS(G,node,marked))
return pred
我运行了你的测试用例。这是打印结果: [1,2,3,4,5,6,7,10,0]
希望答案可以帮到你哦。