使用列表列表保存图表中的每个路径

时间:2018-02-21 16:37:35

标签: python python-3.x algorithm graph-theory breadth-first-search

我必须实现dfs算法来保存起始节点的所有路径。例如,我有以下图表:

enter image description here

我有一个列表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的邻居。

4 个答案:

答案 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中是可变的,所以关键是在每个节点递归中创建路径的深层副本。