【发布时间】:2016-02-03 07:31:00
【问题描述】:
我正在寻找一种非递归深度优先搜索算法来查找无向图中两点之间的所有简单路径(循环是可能的)。
我查了很多帖子,都显示递归算法。 似乎没有人对非递归版本感兴趣。
递归版本是这样的;
void dfs(Graph G, int v, int t)
{
path.push(v);
onPath[v] = true;
if (v == t)
{
print(path);
}
else
{
for (int w : G.adj(v))
{
if (!onPath[w])
dfs(G, w, t);
}
}
path.pop();
onPath[v] = false;
}
所以,我尝试将它作为(非递归),但是当我检查它时,它计算错误
void dfs(node start,node end)
{
stack m_stack=new stack();
m_stack.push(start);
while(!m_stack.empty)
{
var current= m_stack.pop();
path.push(current);
if (current == end)
{
print(path);
}
else
{
for ( node in adj(current))
{
if (!path.contain(node))
m_stack.push(node);
}
}
path.pop();
}
测试图是:
(a,b),(b,a), (b,c),(c,b), (b,d),(d,b), (c,f),(f,c), (d,f),(f,d), (f,h),(h,f)。
它是无向的,这就是为什么有 (a,b) 和 (b,a)。 如果开始和结束节点是'a'和'h',那么应该有两个简单的路径:
a,b,c,f,h
a,b,d,f,h.
但该算法无法同时找到两者。 它显示输出为:
a,b,d,f,h,
a,b,d.
堆栈成为第二条路径的开始,这就是问题所在。 请在将其更改为非递归版本时指出我的错误。 您的帮助将不胜感激!
【问题讨论】:
-
好吧。我想找到简单的路径。
-
你不能使用堆栈并以非递归方式进行吗?
-
我试过了,但是修正当前路径有问题,所以第二个路径会出错。我想我在某个地方错了,所以帮助
-
您作为答案发布的内容(代码和出了什么问题)实际上应该是您问题的一部分。另外,请正确格式化代码(每行开头四个空格)并告诉我们到底出了什么问题。 “计算错误”这句话并没有告诉我们您的预期和得到的结果。
标签: algorithm