如何在算法 BFS 期间跟踪路径

Posted

技术标签:

【中文标题】如何在算法 BFS 期间跟踪路径【英文标题】:How to trace path during algorithm BFS 【发布时间】:2016-03-13 22:00:33 【问题描述】:

我正在寻找一种方法来跟踪我的 bfs 算法的路径,但我不知道如何。也许我错了,但我认为我确实需要一个双重 ArrayList,以保存所有可能的方式。这意味着在以下示例中:

    数组列表:6-3-1 数组列表:6-3-5 数组列表:5-9-7 数组列表:6-9-10

如果有从 3 到 9 的连接,这看起来会更糟。

    public List<E> BFS(N source, N target)
    
        ArrayList<ArrayList<N>> nodes_paths = new ArrayList<ArrayList<N>>();
        ArrayList<N> nodes_list = new ArrayList<N>(graph.getNodes());
        N current_node;

        Queue <N> list = new LinkedList<N>();
        HashMap<N, Boolean> already_visited = new HashMap<N, Boolean>();
//      mark all nodes in HashMap as not visited
        for(int i=0; i<nodes_list.size(); i++)
        
            already_visited.put(nodes_list.get(i), false);
        

        ArrayList<N> successors = new ArrayList<N>();
        list.add(source);

        while(!list.isEmpty())
        
            current_node = list.poll();
            already_visited.put(current_node, true);
          //need to add the node to any path, but don't know to which?
            if(current_node.equals(target))
            

            
            else
            
                successors = new ArrayList<N>(graph.getSuccessors(current_node));
                for(int j=0; j<successors.size(); j++)
                
                    if(!already_visited.get(successors.get(j)))
                    
                        already_visited.put(successors.get(j), true);
                        list.add(successors.get(j));
                    
                
            
        


//      need the path array here!
        ArrayList<E> edges_list = new ArrayList<E>(graph.getEdges());
        ArrayList<E> path_edges = new ArrayList<E>();
        for(int k=0; k<path.size()-1; k++)  //If there are path.size nodes, so therer are only path.size-1 edges
        
            for(int l=0; l<edges_list.size(); l++)
            
                if(path.get(k).equals(edges_list.get(l).getSource()) && path.get(k+1).equals(edges_list.get(l).getTarget()))
                
                    path_edges.add(edges_list.get(l));
                
            
        

        return path_edges;


    

【问题讨论】:

上面给出的图的bfs遍历将是:6 3 9 1 5 7 10。你想要的将由DFS完成。 考虑使用 DFS 搜索所有可能的路线。 已经实现了DFS,但是由于它是一个程序,之后您可以在更多算法之间进行选择,所以也需要实现这个! 【参考方案1】:

这种方法会变得复杂管理,您可以存储一个映射:V->V [从顶点到顶点],它将从每个节点 v 映射,即“发现”v 的顶点 u。

您将在 BFS 迭代期间填充此地图。

稍后 - 您可以通过简单地从目标节点 [在地图中] 重建路径 - 直到您返回源。如果您枚举顶点,则此地图可以实现为数组。

【讨论】:

也称为“前身”或“父”数组。您可以在 CLRS 的 BFS 部分(第 2 版和第 3 版中的第 22.2 节)中找到它。

以上是关于如何在算法 BFS 期间跟踪路径的主要内容,如果未能解决你的问题,请参考以下文章

我如何找到从任何节点到集合A的最短路径

如何在旅行期间使用 iPhone 有效地跟踪我的地理位置

如何在内存分析期间跟踪 .NET 应用程序中内存访问的频率和数量?

使用 BFS/DFS 寻找有向无环图中权重最大的路径

如何使用广度优先搜索在树中找到从一个顶点到另一个顶点的路径?

如何在跟踪期间消除头部伪像 - HDN_TRACK?