使用迭代DFS而不是递归DFS的第一个DFS路径

问题描述

我正在尝试实现一个简单的Dfs路径查找问题,在该问题中,我必须打印遇到的第一个路径,如果找不到路径,则什么也不打印。 我可以通过Recursion做到这一点,但是在迭代版本上遇到了麻烦。

这是我的代码:

#include <iostream>
#include <stack>
#include <map>
using namespace std;

void PrintDFSpath(int **a,int *visited,int start,int end,int v)
{
    map<int,int> parentMap;
    stack<int> s;
    s.push(start);

    while (!s.empty())
    {
        int currEle = s.top();
        visited[currEle]=1;
        s.pop();
        if (currEle == end)
        {
            break;
        }

        for (int i = v - 1; i >= 0; i--)
        {
            if (a[currEle][i] == 1 && !visited[i] && i != currEle)
            {
                if( !parentMap.count(i) )
                    parentMap[i] = currEle;
                s.push(i);
                visited[i] = 1;
            }
        }
        if (s.empty())
        {
            return;
        }
    }
    int i = end;
    cout<<end<<" ";
    while (i != start)
    {
        cout<<parentMap[i]<<" ";
        i = parentMap[i];
    }
}

int main()
{
    int v,e;
    cin >> v >> e;
    int **a = new int *[v];

    for (int i = 0; i < v; i++)
    {
        a[i] = new int[v];
        for (int j = 0; j < v; j++)
            a[i][j] = 0;
    }
    int x,y;
    for (int i = 0; i < e; i++)
    {
        cin >> x >> y;
        a[x][y] = 1;
        a[y][x] = 1;
    }

    int v1,v2;
    cin >> v1 >> v2;

    int *visited = new int[v];
    for (int j = 0; j < v; j++)
        visited[j] = 0;

    PrintDFSpath(a,visited,v1,v2,v);
    return 0;
}

我在这里使用邻接矩阵。

我已经实现了我在StackOverflow上发现的一些东西 例如地图

此外,获得的路径与递归顺序相同,我将孩子按rev顺序插入堆栈。

这是问题陈述

给出一个无向图G(V,E)和两个顶点v1和v2(作为整数),
查找并打印从v1到v2的路径(如果存在)。
如果v1和v2之间没有路径,则不打印任何内容。
使用DFS查找路径并打印遇到的第一个路径。

V是图形G中存在的顶点数,并且顶点从0到V-1编号。
E是图形G中存在的边数。

以相反的顺序打印路径。也就是说,先打印v2,然后再打印中间顶点,最后打印v1。

输入架构

第1行:两个整数V和E(以空格分隔)
下E行:两个整数a和b,表示顶点a和顶点b之间存在边(以空格分隔)
第(E + 2)行:两个整数v1和v2(以空格分隔)

我认为问题出在以下陈述中。

if (currEle == end)
{
    break;
}

但是我不知道如何去纠正它。请提出一些建议

测试用例:
7 8
0 1
1 2
4 5
6 5
1 6
1 2
2 3
0 3
0 3

输出:3 2 1 0

解决方法

基本上,通过从内部for循环中删除以下代码行,您可以获得解决测试用例示例的代码:

if( !parentMap.count(i) )

visited[i] = 1;

在您的代码中,parentMap注册了从当前处理的元素到其子元素的路径的第一次出现。为了模仿递归DFS行为,parentMap应该注册从当前元素到其父元素的路径。当遇到尚未访问的新路径时,通过覆盖现有的地图元素,您可以获得所需的数据。

visited集合应包含您已经已处理的元素。如果您将子级添加到内部visited内的for中,则在将来某个时候仅将它们排队进行处理时,将其标记为已处理。对不履行合同的收藏进行操作几乎总是一个坏主意。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...