【发布时间】:2012-02-08 20:48:34
【问题描述】:
我写了一个递归DFS算法来遍历一个图:
void Graph<E, N>::DFS(Node n)
{
std::cout << ReadNode(n) << " ";
MarkVisited(n);
NodeList adjnodes = Adjacent(n);
NodeList::position pos = adjnodes.FirstPosition();
while(!adjnodes.End(pos))
{
Node adj = adjnodes.ReadList(pos);
if(!IsMarked(adj))
DFS(adj);
pos = adjnodes.NextPosition(pos);
}
}
然后我写了一个使用堆栈的迭代 DFS 算法:
template <typename E, typename N>
void Graph<E, N>::IterativeDFS(Node n)
{
Stack<Node> stack;
stack.Push(n);
while(!stack.IsEmpty())
{
Node u = stack.Read();
stack.Pop();
if(!IsMarked(u))
{
std::cout << ReadNode(u) << " ";
MarkVisited(u);
NodeList adjnodes = Adjacent(u);
NodeList::position pos = adjnodes.FirstPosition();
while(!adjnodes.End(pos))
{
stack.Push(adjnodes.ReadList(pos));
pos = adjnodes.NextPosition(pos);
}
}
}
我的问题是,在一个图中,例如,我输入三个节点 'a'、'b'、'c' 与弧 ('a', 'b') 和 ('a', ' c') 我的输出是:
'a'、'b'、'c' 与递归 DFS 版本,以及:
'a', 'c', 'b' 与迭代 DFS 之一。
我怎样才能得到相同的订单?我是不是做错了什么?
谢谢!
【问题讨论】:
-
两个订单都是有效的 DFS 订单,因为节点 'b' 和 'c' 都可以从节点 'a' 一跳到达。您是否担心这会产生无效的订购?还是您只是希望这两种算法(似乎都产生有效的排序)产生相同的排序?
-
我知道使用堆栈我应该能够以迭代的方式模拟递归函数,那为什么我得不到相同的输出呢?
-
在迭代解决方案中,当您将顶点的邻接列表压入堆栈时,在将它们压入堆栈之前将列表反转。
标签: c++ algorithm graph depth-first-search traversal