访问所有节点并将其添加到路径

时间:2018-05-20 15:33:47

标签: python algorithm graph-algorithm

我尝试访问所有节点,返回开始节点(Neamt)并将访问过的节点添加到path但问题是如果我到达死胡同,城市已从{ {1}}。

enter image description here

以下是代码产生的path中的1个:

path

如上面['Neamt', 'Iasi', 'Vaslui', 'Urziceni', 'Bucharest', 'Fagaras', 'Sibiu', 'Oradea', 'Zerind', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Pitesti', 'Rimnicu Vileea']所示,没有path。 真正发生的是我在PyCharm上调试时:'Hirsova', 'Eforie', 'Giurgiu'已添加到'Hirsova', 'Eforie', 'Giurgiu',但随后会从path中删除。

我希望将这些城市纳入path作为逆序。例如:

path

为什么会从['Neamt', 'Iasi', 'Vaslui', 'Urziceni', 'Hirsova', 'Eforie', 'Hirsova', 'Urziceni', 'Bucharest', 'Giurgiu', 'Bucharest', 'Pitesti', 'Rimnicu Vileea', 'Craiova', 'Drobeta', 'Mehadia', 'Lugoj', 'Timisoara', 'Arad', 'Zerind', 'Oradea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt',]中删除它们,因为path方法与.append方法没有任何对立?

.delete

2 个答案:

答案 0 :(得分:2)

没有删除任何内容,您只是看到find_paths的不同框架具有不同的path值。 list(path)生成副本,因此每个函数调用都会收到自己的列表,一旦函数调用结束,然后向上移动递归堆栈,您会看到一个旧的path值没有附加节点它

答案 1 :(得分:2)

在输入递归之前和之后,您只需要进行深度优先搜索并添加节点。这会在您启动路径时在列表中放置一个名称,然后在返回途中再次展开。这个过程是:

  1. 添加城市
  2. 对孩子进行递归(如果孩子未被访问)
  3. 再次添加城市(如果它不是路径的末尾)
  4. 您需要添加路径结束检查,这样就不会连续两次添加像Eforie这样的城市。如果某个城市没有未经访问过的孩子,则不要再次添加。为此,只需跟踪递归计数。

    类似的东西:

    def find_paths(node, cities, path, distance, visited = set()):
    
        visited.add(node) # keep track of visited nodes
        path.append(node)
    
        # Fork paths for all possible cities not yet used
        count = 0 # avoid adding end paths twice
        for city in cities[node].keys(): # only recurse on children not the whole list
            if city not in visited: 
                count += 1
                find_paths(city, cities, path, distance, visited)
        if count > 0 : # only add again if there were children
            path.append(node)
    
    a = []
    find_paths('Neamt', cities, a, 0)
    print(a)
    

    结果

      <'Neamt','Iasi','Vaslui','Urziceni','Bucharest','Fagaras','Sibiu','Arad','Timisoara','Lugoj','Mehadia','Drobeta ','Craiova','Pitesti','Rimnicu Vileea','Pitesti','Craiova','Drobeta','Mehadia','Lugoj','Timisoara','Zerind','Oradea','Zerind' ,'Arad','Sibiu','Fagaras','Giurgiu','Bucharest','Hirsova','Eforie','Hirsova','Urziceni','Vaslui','Iasi','Neamt'] < / p>