Leetcode1557.Número mínimo de puntos que pueden llegar a todos los puntos (medio)

contenido

1. Descripción del problema

2. Análisis de resolución de problemas

3. Implementación del código


1. Descripción del problema

Se le proporciona un  gráfico acíclico dirigido  con  n nodos numerados  0 hasta  n-1 y una matriz  edges de  aristas que edges[i] = [fromi, toi] representan una arista dirigida de un  fromi punto a otro  toi .

Encuentre el conjunto de puntos más pequeño tal que todos los puntos en el gráfico se puedan alcanzar desde estos puntos. El problema garantiza que la solución existe y es única.

Puede devolver estos números de nodo en cualquier orden.

Ejemplo 1:

Entrada: n = 6, aristas = [[0,1],[0,2],[2,5],[3,4],[4,2]]
 Salida: [0,3]
 Explicación: Desde un La salida de un solo nodo no puede llegar a todos los nodos. Desde 0 podemos llegar a [0,1,2,5]. De 3 podemos llegar a [3,4,2,5]. Entonces generamos [0,3].

Ejemplo 2:

Entrada: n = 5, aristas = [[0,1],[2,1],[3,1],[1,4],[2,4]]
 Salida: [0,2,3]
 Explicación: Tenga en cuenta que los nodos 0, 3 y 2 no son accesibles desde otros nodos, por lo que debemos incluirlos en el conjunto de puntos de resultado, que llegan a los nodos 1 y 4.

insinuación:

  • 2 <= n <= 10^5
  • 1 <= edges.length <= min(10^5, n * (n - 1) / 2)
  • edges[i].length == 2
  • 0 <= fromi, toi < n
  • Todos los pares de puntos son  diferentes (fromi, toi) entre sí.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/minimum-number-of-vertices-to-reach-all-nodes Los
derechos de autor pertenecen a Leetcode.com. Para reimpresiones comerciales, comuníquese con la autorización oficial y para reimpresiones no comerciales, indique la fuente.

2. Análisis de resolución de problemas

        Un nodo con un grado de entrada de 0 definitivamente debe aparecer en el conjunto de respuestas. Puede comenzar a atravesar todos los nodos accesibles del conjunto de nodos con un grado de entrada de 0 y luego volver a seleccionar el punto de inicio para que los nodos restantes los atraviesen hasta que se visiten todos los nodos al final.

        Se puede manejar de la siguiente manera:

(1) Primero construya una lista de adyacencia y determine el conjunto de nodos con un grado de entrada de 0

(2) Realice un recorrido BFS o DFS de múltiples fuentes desde el conjunto de nodos con un grado de entrada de 0

(3) Seleccione uno de los nodos restantes no visitados para iniciar el recorrido BFS o DFS

(4) Repita (3) hasta que no queden nodos sin visitar

        

        De hecho, dado que la pregunta puede garantizar que la solución existe y es única, la respuesta debe ser el conjunto de nodos con un grado de entrada de 0, y no se necesita más búsqueda.

3. Implementación del código

class Solution:
    def findSmallestSetOfVertices(self, n: int, edges: List[List[int]]) -> List[int]:
        zero_indegree=n*[0]
        for edge in edges:
            zero_indegree[edge[1]] = 1
        #print(zero_indegree)
        return [k for k in range(n) if zero_indegree[k]==0]

        Tiempo de ejecución: 112 ms, superando al 86,10 % de los usuarios en todas las confirmaciones de Python3

        Consumo de memoria: 35,2 MB, supera al 95,64 % de los usuarios en todas las confirmaciones de Python3

        Se sospecha que esta pregunta como medio está equivocada.

        Volver al directorio principal: notas diarias de resolución de problemas de Leetcode (actualización dinámica...)

Supongo que te gusta

Origin blog.csdn.net/chenxy_bwave/article/details/124295974
Recomendado
Clasificación