es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encuentra todos los caminos en un árbol representado como un grafo, desde cualquier nodo a cualquier otro nodo. (Solo en dirección hacia abajo)

Dado los bordes

Bordes: {{1,2},
{1,3},
{3,4},
{3,5},
{5,6}};

Encuentra todos los posibles caminos desde cualquier nodo hasta cualquier nodo (Nota: solo se mueve hacia abajo desde el nodo raíz).

Salida esperada:

1->2
1->3
1->3->4
1->3->5
1->3->5->6
3->4
3->5
5->6
3->5->6

He escrito el código para esto. Pero solo puedo obtener: 1->2, 1->3, 3->4, 3->5, 5->6.

Código: https://leetcode.com/playground/bEp484tr

static void dfs(int source){
Stack stack = new Stack<>();
HashSet visited = new HashSet<>();
int currVertex;
String path = “”;

stack.push(source);
visited.add(source);

while(!stack.isEmpty()){
    currVertex = stack.pop().intValue();
    path += currVertex;

    if(!adjList.containsKey(currVertex)){
        continue;
    }

    // Visiting its neighbours
    for(int neighbour : adjList.get(new Integer(currVertex))){
        if(!visited.contains(new Integer(neighbour))){
            path += neighbour;

            visited.add(neighbour);
            stack.push(neighbour);

            System.out.println(path);

            // Undo
            path = path.substring(0, path.length() - 1);

        }
    }

    path = "";
}

}

¿Podría ayudarme a entender dónde me equivoqué, por qué solo se imprime la salida de dos dígitos?
Además, ¿cómo manejo el caso para 3->5->6? Este es el caso en el que el nodo padre no es el nodo raíz.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El código que ha escrito solo puede recorrer el gráfico de manera descendente desde el nodo raíz, lo que significa que solo recorrerá hacia abajo el gráfico. Para obtener todos los caminos desde cualquier nodo hasta cualquier otro nodo, debes recorrer el gráfico de manera ascendente y en horizontal.

    En el recorrido en horizontal y vertical, debes hacer un seguimiento del camino desde el nodo raíz hasta el nodo actual. Esto se puede hacer usando una cola en lugar de una pila y haciendo un seguimiento del camino en una cadena.

    Por ejemplo, cuando visitas el nodo 3, puedes agregar el camino 1->3 a la cola. Cuando visitas el nodo 4, puedes agregar el camino 1->3->4 a la cola. De esta manera, puedes hacer un seguimiento del camino desde el nodo raíz hasta el nodo actual.

    Una vez que tengas el camino desde el nodo raíz hasta el nodo actual, puedes imprimir el camino desde cualquier nodo hasta cualquier otro nodo. Por ejemplo, para el camino 1->3->5->6, puedes imprimir el camino desde el nodo 3 hasta el nodo 6 como 3->5->6.

    Puedes encontrar una implementación de ejemplo del recorrido en horizontal y vertical aquí.

Comments are closed.