Cómo imprimir rutas en forma DFS en gráficos

Una forma de lograr su objetivo podría ser siempre comenzar a explorar una ruta de una manera DFS desde la raíz, y una vez que llegue a una hoja, imprima la ruta, quite la hoja y todos sus padres hasta el primer nodo de grado mayor que dos . Tienes que hacer esta eliminación “recursiva”: si solo eliminaste las hojas, en algún momento confundirías el padre de una hoja con una hoja en sí.

El algoritmo haría lo siguiente, en el gráfico de su imagen:

  1. Imprimir A, B, E.
  2. Eliminar E pero no B (tiene grado 3)
  3. Imprimir A, B, F.
  4. Eliminar F y B, que ahora tiene grado 2.
  5. Imprimir A, C, G.
  6. Eliminar G y C, que tiene grado 2.
  7. Imprimir A, D, H.
  8. Eliminar H pero no D (tiene grado 3).
  9. Imprimir A, D, I.
  10. Eliminar I y D (tiene grado 2).
  11. Solo queda la raíz. Regreso.

El método PrintAllPath se llamará recursivamente y, en el caso base, imprimirá la ruta.

A medida que hacemos DFS, la lista llamada ruta hará un seguimiento de la ruta actual y necesitamos imprimirla una vez que se alcanza la condición base.

///
/// Imprime todas las rutas en un árbol n-ary
///
clase AllPathInNArayTree
{
///

/// Almacena la ruta a medida que se realiza el recorrido
///
List path = new List ();

///
/// La subrutina recursiva que hace DFS y la condición base es alcanzada
/// una vez que se golpea el nodo hoja.
///
/// vacío PrintAllPath (Nodo n)
{
if (n.Children.Count == 0)
{
// este es un nodo hoja necesitamos imprimir la ruta
ruta.Agregar (n);
PrintPath ();
ruta. Eliminar (n);
regreso;
}
ruta.Agregar (n);
foreach (Nodo hijo en n.Niños)
{
PrintAllPath (hijo);
}
ruta. Eliminar (n);
}

///
/// Imprime la ruta actual hasta el nodo hoja
///
privado vacío PrintPath ()
{
foreach (Nodo n en el camino)
{
Console.Write (“{0} ->”, n.Data);
}
Console.WriteLine ();
}

///
/// Representa el nodo de un árbol n_ary
///
Nodo de clase
{
Datos de char públicos {get; conjunto; }
Lista pública Hijos {get; conjunto; }
Nodo público (datos de char)
{
Datos = datos;
Hijos = nueva Lista
();
}
}

#region TestArea
público estático vacío TestAllPathInNArayTree ()
{
Nodo nodoA = nuevo nodo (‘A’);
Nodo nodoB = nuevo nodo (‘B’);
Nodo nodoC = nuevo nodo (‘C’);
Nodo nodoD = nuevo nodo (‘D’);
Nodo nodoE = nuevo nodo (‘E’);
Nodo nodoF = nuevo nodo (‘F’);
Nodo nodoG = nuevo nodo (‘G’);
Nodo nodoH = nuevo nodo (‘H’);
Nodo nodoI = nuevo nodo (‘I’);
nodeA.Children = new List () {nodeB, nodeC, nodeD};
nodeB.Children = new List
() {nodeE, nodeF};
nodeC.Children = new List
() {nodeG};
nodeD.Children = new List
() {nodeH, nodeI};

AllPathInNArayTree allPath = new AllPathInNArayTree ();
allPath.PrintAllPath (nodeA);

}
#endregion
}

La salida del código anterior es como se muestra a continuación:

A -> B -> E ->

A -> B -> F ->

A -> C -> G ->

A -> D -> H ->

A -> D -> I ->

Espero que esto te ayude.

Por favor agregue la línea 30.

#! / usr / bin / python

Nodo de clase:
def __init __ (self, name):
self.name = name
self.children = []

A = Nodo (‘A’)
B = Nodo (‘B’)
C = Nodo (‘C’)
D = Nodo (‘D’)
E = Nodo (‘E’)
F = Nodo (‘F’)
G = Nodo (‘G’)
H = Nodo (‘H’)
I = Nodo (‘I’)
A.niños = [B, C, D]
B. niños = [E, F]
C.niños = [G]
D. niños = [H, I]

# DFS comienza aquí

def dfs (nodo):
sta.append (nodo)
si no node.children:
print ([nombre.nodo para nodo en sta])
para niño en node.children:
dfs (niño)
sta.pop ()

sta = []
dfs (A)

More Interesting

Cómo implementar este algoritmo usando Matlab

¿Cómo debo usar el libro Introducción a los algoritmos de Cormen de manera efectiva? ¿Es mejor elegir un tema que haya encontrado en algún lugar de la programación competitiva y leer un algoritmo relacionado con eso o revisarlo de principio a fin?

¿Cuál es el algoritmo utilizado para mostrar el orden de amigos que se muestra en toda la lista de amigos en Facebook?

¿Cómo entender el algoritmo SHA-1? ¿Cuáles son los mejores ejemplos para ello?

¿Cómo manejan los sistemas de reputación los sesgos (sistémicos) que pueden distorsionar significativamente las clasificaciones basadas en tales sistemas?

¿Cómo se puede desarrollar la lógica en la programación?

¿Cuál es la diferencia entre el orden de fusión de arriba hacia abajo y el de fusión de abajo hacia arriba?

Cómo verificar si una cadena es un prefijo de otra cadena en O (1)

¿Se ha completado Javascript Turing?

Cómo escribir un algoritmo

¿Cuáles son algunas optimizaciones comunes que los clientes de GPS como Google Maps usan además de los algoritmos elementales de ruta más corta como la búsqueda A *?

¿Cuándo se debe comenzar a resolver los problemas del Proyecto Euler en HackerRank? He resuelto alrededor de 50 en SPOJ, entonces, ¿es el momento adecuado para comenzar?

¿Cuál fue el primer juego de computadora en usar un generador de números aleatorios?

¿En qué tipos de gráfico DFS y BFS producirán el mismo árbol (misma fuente) independientemente de la secuencia de visitas de los vecinos?

¿Qué estructuras de datos y algoritmos de programación heredados se enseñan en la universidad pero que no se usan después de la academia? ¿Aún debemos aprenderlos?