La espada se refiere a oferta110: todos los caminos

Pregunta:
dado un gráfico acíclico dirigido con n nodos, representado por un gráfico de matriz bidimensional, encuentre todas las rutas de 0 a n-1 y la salida (no es necesario que estén en orden).
Todas las celdas en la i-ésima matriz del gráfico representan los siguientes nodos a los que puede llegar el nodo i en el gráfico dirigido. →a ), si está vacío, no hay siguiente nodo.
Ejemplo 1:
inserte la descripción de la imagen aquí
Entrada: gráfico = [[1,2],[3],[3],[]]
Salida: [[0,1,3],[0,2,3]]
Explicación: Hay dos caminos 0 -> 1 -> 3 y 0 -> 2 -> 3

Ejemplo 2:
inserte la descripción de la imagen aquí
Entrada: gráfico = [[4,3,1],[3,2,4],[3],[4],[]]
Salida: [[0,4],[0,3,4 ],[0,1,3,4],[0,1,2,3,4],[0,1,4]]

Análisis:
el título solicita enumerar todas las rutas desde el nodo 0 hasta el nodo n-1 de todos los n-1, por lo que la búsqueda en profundidad es una opción más apropiada.
La búsqueda en profundidad generalmente se implementa de forma recursiva. La búsqueda comienza desde el nodo 0. Cada vez que se busca el nodo i, el nodo se agrega primero a la ruta. Si el nodo resulta ser el nodo n-1, entonces se encuentra una ruta desde el nodo 0. Ruta al nodo n-1, si no, busque cada nodo adyacente del gráfico[i] y busque de la misma manera. Cuando se hayan buscado todos los nodos a los que se puede acceder desde el nodo i, volverá al nodo anterior para buscar otros nodos adyacentes. Antes de volver al nodo anterior, se debe eliminar el nodo i de la ruta, este proceso se puede realizar con el siguiente código recursivo.
En este código, la ruta registra todos los nodos en la ruta actual y el resultado registra todas las rutas que se han encontrado. El código de apelación no determina si se ha visitado un nodo. Por lo general, es necesario determinar si se ha visitado un nodo. durante la búsqueda de gráficos, lo que puede evitar visitar repetidamente los nodos en el anillo. Dado que el problema ya ha dejado en claro que el gráfico es un gráfico acíclico dirigido, no hay necesidad de preocuparse por visitar repetidamente el
código del nodo en el anillo:

package com.kuang;

import java.util.LinkedList;
import java.util.List;

public class AllPathsSourceTarget {
    
    
    public static void main(String[] args) {
    
    
        AllPathsSourceTarget allPathsSourceTarget = new AllPathsSourceTarget();
        int[][] graph = {
    
    {
    
    1,2},{
    
    3},{
    
    3},{
    
    }};
        List<List<Integer>> lists = allPathsSourceTarget.allPathsSourceTarget(graph);
        System.out.println(lists);
    }
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
    
    
        List<List<Integer>> result = new LinkedList<>();
        List<Integer> path = new LinkedList<>();
        dfs(0,graph,path,result);
        return result;
    }

    private void dfs(int source, int[][] graph, List<Integer> path, List<List<Integer>> result) {
    
    
        path.add(source);
//        如果该节点正好是节点n-1,那么就找到一条从节点0到节点n-1的路径
        if (source  == graph.length-1){
    
    
//            将路径添加到结果集中
            result.add(new LinkedList<Integer>(path));
        }else {
    
    
            for (int next:graph[source]){
    
    
                dfs(next,graph,path,result);
            }
        }
        //在回到前一个节点之前,需要将节点i从路径中删除
        path.remove(path.size()-1);
    }
}

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Jiaodaqiaobiluo/article/details/123966586
Recomendado
Clasificación