contenido
2. Análisis de resolución de problemas
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...)