繁体   English   中英

创建递归路径查找算法以查找图中两个节点之间的所有路径

[英]Creating a recursive path finding algorithm to find all paths between two nodes in a graph

我已经实现了一个 DFS 递归算法来查找有向图上两个节点之间的所有路径。 目前,我的算法正在查找要查找的总路径的大约一半(我在一个在线工具上检查了应该有多少条可能的路径)。 我不确定我的算法哪里出错了。 我检查了一堆不同的帖子,这似乎是其他人已经实施的,但我想我可能忽略了一些东西。 这是我的第一个寻路算法,我似乎在我的第一个障碍中跌跌撞撞。 我不允许使用内置的 ADTS,因此我建立了自己的。 感谢任何帮助,因为我真的正在把我的头发拉出来。 如果您需要更多信息/代码,请告诉我。

寻找路径

private void findPaths(String current, String target, LinkedList<String> currPath)
{
    Edge edge;

    if(current == target)
    {
        System.out.println(curPath.toString());
        return;
    }
    for (Vertex vertex: current.getAdjacent()))
    {
        Edge edge = getEdge(current+vertex);
        if(!edge.getVisited())
        {
            edge.setVisited;
            curPath.insertLast(vertex);
            findPaths(vertex, target, currPath);
            curPath.removeLast()
        }
    }
    edge.clearVisited()
}

编辑以提高可读性。

我假设问题出在这个代码片段中:

for (Vertex vert1 : current.getVerts())      // say you have 4 unvisited edges
{
    label = vert1.toString();
    if(!getEdge(current+label).getVisited()) 
    {
        getEdge(current+label).setVisited(); // you will mark the 4 as visited 
        paths.addToPath(label);
        findPaths(vert1, target, paths);
        paths.removeFromPath();
    }
}
getEdge(current+label).clearVisited();      // but unmark only the last one 

你应该用

for (Vertex vert1 : current.getVerts())
{
    label = vert1.toString();
    if(!getEdge(current+label).getVisited())
    {
        getEdge(current+label).setVisited();   // mark this edge
        paths.addToPath(label);
        findPaths(vert1, target, paths);
        paths.removeFromPath();
        getEdge(current+label).clearVisited(); // unmark this edge
    }
}

或者更简洁,您可以按如下方式重构代码:

private void findPaths(Vertex current, String target, Paths<String> paths)
    if(current.label.equals(target))
    {
        System.out.println(paths.getCurrPath());
        return;
    }
    for (Vertex vert1 : current.getVerts())
    {
        String label = vert1.toString();          // declare&initialize in loop
        Edge e = getEdge(current+label);          // lookup only once
        if( ! e.getVisited())
        {
            e.setVisited();
            paths.addToPath(label);
            findPaths(vert1, target, paths);
            paths.removeFromPath();
            e.clearVisited();
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM