He escrito un algoritmo DFS recursiva para atravesar un gráfico:iterativo DFS vs Recursive DFS y diferentes elementos de pedido
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);
}
}
Entonces he escrito un algoritmo DFS iterativo utilizando una pila:
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);
}
}
}
Mi problema es que en un gráfico en el que, por ejemplo, ingreso los tres nodos 'a', 'b', 'c' con arcos ('a', 'b') y ('a', 'c') Mi salida es:
'a', 'b', 'c' con la versión DFS recursiva y:
'a', 'c', 'b' con el iterativo DFS uno.
¿Cómo podría obtener el mismo pedido? ¿Estoy haciendo algo mal?
¡Gracias!
Ambos pedidos son pedidos válidos de DFS, ya que los nodos 'b' y 'c' son accesibles en un salto desde el nodo 'a'. ¿Le preocupa que esto esté produciendo un pedido inválido? ¿O solo quiere que los dos algoritmos, que parecen producir pedidos válidos, produzcan el mismo orden? – templatetypedef
Sé que al usar una pila, debería poder emular una función recursiva de forma iterativa, ¿por qué no obtengo el mismo resultado? – JohnQ