如何解决使用迭代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
中,则在将来某个时候仅将它们排队进行处理时,将其标记为已处理。对不履行合同的收藏进行操作几乎总是一个坏主意。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。