Graph 深度优先搜索以找到最短路径?

Graph 深度优先搜索以找到最短路径?,graph,shortest-path,depth-first-search,maze,Graph,Shortest Path,Depth First Search,Maze,我知道这通常是通过广度优先来完成的,但我们被要求同时使用这两种方法,我已经完成了广度优先 我觉得这是一个非常典型的使用深度优先搜索的例子,所以我希望我能在这里得到一些帮助。。。我正试图通过深度优先搜索找到迷宫中的最短路径,但现在我还不知道该怎么做。这是我目前的代码: void maze::findPathRecursive(graph &g, int position, int goal) { if (position == goal) { isPath = tr

我知道这通常是通过广度优先来完成的,但我们被要求同时使用这两种方法,我已经完成了广度优先

我觉得这是一个非常典型的使用深度优先搜索的例子,所以我希望我能在这里得到一些帮助。。。我正试图通过深度优先搜索找到迷宫中的最短路径,但现在我还不知道该怎么做。这是我目前的代码:

void maze::findPathRecursive(graph &g, int position, int goal) {
    if (position == goal) {
        isPath = true; //returns true if there is a path to the goal
        correctPath.push_back(position); // the path to the goal
    } else {
        g.mark(position);
        g.visit(position);

        //gets all the neighbors of the current position
        vector<int> neighbors = getNeighbors(position, g);

        while (!neighbors.empty()) {
            int n = neighbors.back();
            neighbors.pop_back();

            if (!g.isVisited(n)) {
                findPathRecursive(g, n, goal);
            } 

            if (isPath) {
                correctPath.push_back(position);
                break;
            } 
        } 
    } 
} 
void迷宫::findPathRecursive(图形&g、整数位置、整数目标){
如果(位置==目标){
isPath=true;//如果存在到目标的路径,则返回true
正确路径。向后推(位置);//目标路径
}否则{
g、 标记(位置);
g、 参观(职位);
//获取当前位置的所有邻居
向量邻域=获取邻域(位置,g);
而(!neights.empty()){
int n=neights.back();
邻居,回来;
如果(!g.isn)){
findPathRecursive(g,n,目标);
} 
如果(iPath){
正确路径。推回(位置);
打破
} 
} 
} 
} 
现在,它要做的就是找到通往目标的第一条路,然后从那里突破。我知道我需要消除中断,我尝试创建另一个向量来存储最短路径,并比较它和前一个最短路径之间的长度,但它不起作用,因为我觉得我需要在某个点取消节点的访问,但无法确定如何在此处准确执行

非常感谢您的帮助


g是一个包含迷宫的图形

一般来说,您不想使用DFS来查找最短路径(除非您的图形是非循环的,并且是无向的,在这种情况下,只有一条路径可以到达您的目标。)这是可能的,但它非常做作。在最简单的层面上,DFS更善于确定是否存在路径,然后确定最佳路径是什么


我建议大家看看不同的广度优先搜索(BFS)算法。如果你的迷宫在网格上,a*可能是你最好的选择。

我不确定我是否完全理解这个问题,但通常,你不会使用广度优先搜索(至少在最简单的情况下)?在我看来,任何试图找到最短路径的DFS都必须变成某种BFS,因为DFS可能“错过”快捷方式

也许这个和这个都有帮助。

虽然使用DFS可以找到一条路径(如果幸运的话,还可以找到一条最短路径),但它通常不能保证找到一条最短路径。BFS是你最好的选择

然而,有一种方法叫做。 来自维基百科:

迭代深化深度优先搜索(IDDFS)是一种状态空间 重复执行深度受限搜索的搜索策略, 在每次迭代中增加深度限制,直到达到d,则 最浅目标状态的深度。IDDFS相当于 广度优先搜索,但使用的内存要少得多;在每次迭代中 以与深度优先相同的顺序访问搜索树中的节点 搜索,但第一次访问节点的累积顺序为 实际上,广度优先

伪代码,同样来自维基百科:

> IDDFS(root, goal) {
>   depth = 0
>   for(i=1, i<10, i++)   {
>       DFS(limit=i)
>   }
> }
>IDDFS(根目录,目标目录){
>深度=0
>对于(i=1,i DFS)(限制=i)
>   }
> }
首先实现DFS(应该与BFS完全相同,但使用堆栈而不是队列),然后实现ID算法。
希望这有帮助。

而不是“取消访问”一个节点,我想你需要和每个节点一起存储到达该节点所需的边数。如果你通过较短的路径再次到达该节点,你会更新该节点以及从该节点到目标的最佳路径上的所有节点的边数。

你能确认你的图是否是非循环的吗?@nobillygreen现在的工作方式是,即使我t做了一个大圆圈,第一个节点将被标记为已访问,并且将无法再次访问,因此在某种程度上,是的,这可能是重复的,因为我们必须同时执行这两项任务,我理解广度优先,但深度优先似乎让我感到困惑“除非你的图是非循环且无向的,在这种情况下,目标只有一条路径以“->开头,否则这不是真的,想象一个连接到N个节点的根,然后所有的N个节点都连接到目标。这是一个非循环无向图,有多条路径到目标。@ReubenMorais”连接到N个节点的根,然后所有这些N个节点都连接到目标“-在这样的环境中有很多循环graph@mangusta说得好,我已经习惯于思考有向无环图了,我一定忘了我们讨论的是无向图。不确定你是如何找到这个问题的答案的,但请检查我给出的答案,它链接到了回答这个问题的另一个问题