我必须实现dfs算法来保存起始节点的所有路径。例如,我有以下图表:
我有一个列表path = []
来保存从节点1开始的所有路径。所以我的列表将只有起始节点1:1,然后我将检查1的邻居是哪个节点2和列表将是:[1,2]
。
现在我检查2的邻居是3和4.现在列表我认为它将像[[1,2,3], [1,2,4]]
,最后列表将是[[1,2,3], [1,2,4,5], [1,2,4,6]]
。我该如何实现呢?我有每个节点的邻居但我不知道如何保存每条路径,因为我是python的新手。
这是我的代码:
def bfs(G, s):
paths = []
q = queue.Queue()
visited = []
q.put(s)
visited.append(s)
while not q.empty():
v = q.get()
for node in G.neighbors(v):
#here i think that i must save the paths
if node not in visited:
q.put(node)
visited.append(node)
我使用networkx创建了Graph。所以G是我的图,s是起始节点,用G.neighbors(v)
我可以找到节点v的邻居。
答案 0 :(得分:0)
background-image
这应该可以做到。我没有测试它。我只使用了Python的本机列表功能而不是Queue类。我从我的路径列表开始,该列表是包含单个节点的单个路径的列表。另外,我有一个我需要关注的路径列表,名为toFollow,就像你的队列一样。虽然仍然有一个节点要遵循,但我将它从队列中弹出(从头开始)。然后我在路径中找到相应的列表。之后,我为每个邻居制作新的列表。如果这不是零,我删除current_path,因为它不完整。
答案 1 :(得分:0)
一个非常简单的深度优先搜索可以如下:给定起始(头)节点,访问节点的子节点,并为每个子节点找到它的子节点,并重复迭代,从而重复进程本身(递归) :
$REACT_APP_DATABASE_URL
输出:
def dfs(tree, start, target):
if start == target:
return True
if start not in tree:
return False
for child in tree[start]:
current = dfs(tree, child, target)
if current:
return True
result = dfs({1:[2], 2:[3, 4], 4:[5, 6]}, 1, 5)
result1 = dfs({1:[2], 2:[3, 4], 4:[5, 6]}, 1, 10)
print(bool(result))
print(bool(result1))
更短的方式:
True
False
输出:
def dfs(tree, start, target):
try:
return reduce(lambda x, y:x+y, [True if i == target else dfs(tree, i, target) for i in tree[start]])
except:
return False
print(bool(dfs({1:[2], 2:[3, 4], 4:[5, 6]}, 1, 5)))
答案 2 :(得分:0)
我这样做的方法是跟踪用于到达每个节点的路径。请参阅我的回答here:
跟踪到达目标的路径。一个 简单的方法就是将整个路径推入队列 到达节点,而不是节点本身。
我无法帮助您使用python,但我希望Java示例足够清晰。
答案 3 :(得分:0)
django_heroku.settings(locals(), logging=False)
这会打印[[1、2、3],[1、2、4、5],[1、2、4、6]]
由于列表在python中是可变的,所以关键是在每个节点递归中创建路径的深层副本。