首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用迭代DFS而不是递归DFS的第一个DFS路径。

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

Stack Overflow用户
提问于 2020-09-08 15:36:03
回答 1查看 198关注 0票数 1

我试图实现一个简单的Dfs路径查找问题,在这个问题中,我必须打印我遇到的第一条路径,如果没有找到路径,则什么也不打印。我能够用递归完成这个任务,但是迭代版本有问题。

这是我的代码:

代码语言:javascript
复制
#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 (用空格分隔)

我认为这个问题来自以下声明。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-08 18:55:58

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

代码语言:javascript
复制
if( !parentMap.count(i) )

代码语言:javascript
复制
visited[i] = 1;

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

visited集合应该包含已经处理过的元素。如果在内部visited循环中将子元素添加到for中,则将它们标记为已处理,当它们只是在将来某个时候被排队的处理时。在不履行合同的集合上操作几乎总是一个坏主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63797185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档