在图中运行 DFS 的问题

Posted

技术标签:

【中文标题】在图中运行 DFS 的问题【英文标题】:Issues in running DFS in a graph 【发布时间】:2017-03-16 18:58:00 【问题描述】:

节点包含 (String from, String to, int time)。 给定一个 HashMap,key 是一个 String,value 是一个具有相同 from 的 Node 列表。

我想编写一个函数来查找从给定起点(字符串起点)到终点(字符串终点)的所有可能路径。我试图编写一个 dfs 函数,但它看起来只返回一组结果。任何人都可以帮忙吗?

节点:String from,String to,int time List> res:节点列表的结果列表 列表列表:记录当前节点的临时列表 HashMap> 图:key都是from value,value是相同from的节点列表 cur:从一个起始值开始并更改每个 dfs 结束:目的地

visited: 记录访问/来自的集合

private static void dfs(res, list,HashMap<String, List<Node>> graph,String cur, String end, visited)
    if(cur.equals(end)) 
        res.add(new ArrayList<Node>(list));
        return;
    
    for(Node n : graph.get(cur)) 
        if (visited.contains(n.to)) continue;
        list.add(n);
        visited.add(n.to);
        dfs(res, list, graph, n.to, end, visited);
        list.remove(list.size()-1);
        visited.remove(visited.size()-1);
    

【问题讨论】:

【参考方案1】:

我怀疑错误在行

    visited.remove(visited.size()-1);

如果您查看Set JavaDoc,您会注意到唯一的remove 方法是boolean remove(Object o),并且没有像List 那样按索引删除。所以这条线是有效的(感谢自动装箱):

    visited.remove(Integer.valueOf(visited.size()-1));

这显然不是您想要的,因为它不会删除任何内容。尝试按值删除最后访问的节点:

    visited.remove(n.to);

【讨论】:

非常感谢。这就是我要找的!

以上是关于在图中运行 DFS 的问题的主要内容,如果未能解决你的问题,请参考以下文章

删除一些边缘后的 DFS

为啥用 DFS 而不是 BFS 在图中寻找循环

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

在没有树边的无向图中循环?

DFS&BFS

无向图中的循环数