[LeetCode en Python] horario del curso 207 (M)

Titulo

https://leetcode-cn.com/problems/course-schedule/

Debe tomar cursos numCourse este semestre, denotado como 0 para numCourse-1.
Se requieren algunos cursos de requisitos previos antes de tomar ciertos cursos. Por ejemplo, si desea estudiar el Curso 0, primero debe completar el Curso 1. Utilizamos una coincidencia para representarlos: [0,1]
Dado el número total de cursos y sus requisitos previos, juzgue si es posible completar todos los cursos.

Ejemplo 1:

Entrada: 2, [[1,0]]
Salida: verdadera
Explicación: Hay 2 cursos en total. Antes de estudiar el curso 1, debe completar el curso 0. Entonces esto es posible.

Ejemplo 2

Entrada: 2, [[1,0], [0,1]]
Salida: falso
Explicación: Hay 2 cursos en total. Antes de aprender el curso 1, debe completar el curso 0; y antes de aprender el curso 0, también debe completar el curso 1. Esto es imposible
 
Consejos:

El requisito previo para la entrada es el gráfico representado por la lista de bordes, no la matriz de adyacencia. Para más detalles, consulte la representación del diagrama.
Puede suponer que no hay bordes duplicados en los requisitos previos de entrada.
1 <= numCourses <= 10 ^ 5

Ideas para resolver problemas

Esta pregunta es en realidad encontrar un anillo en la imagen.

  • Clasificación topológica
  • Primero construya el gráfico de acuerdo con el orden de los cursos.
  • Inicialice la matriz de estado del curso, inicializada a no accedida
  • Hay tres tipos de estado: no visitado, visitante, visitado
  • Recorre todos los nodos del gráfico y realiza DFS en cada nodo
  • Después de que ingrese DFS, verifique la matriz de estado,
    • Si el estado actual del nodo está accediendo, significa que hay un anillo, devuelve False
    • Si se visita el estado del nodo actual, significa que no hay necesidad de continuar, devuelva True
    • El estado restante no está visitado,
      • Primero configure el estado de este nodo para acceder
      • Si hay nodos posteriores en este nodo, repita los nodos posteriores, DFS en cada nodo y verifique el valor de retorno
      • Finalmente, establezca el estado de este nodo como visitado
  • Si hay un anillo, el proceso anterior devolverá False, de lo contrario devolverá True

Código

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        # - build graph
        g = defaultdict(list)
        for a,b in prerequisites:
            g[b].append(a)

        # - course status
        # - 0: unvisited, 1: visiting, 2: visited
        status_list = [0] * numCourses

        # - dfs
        def dfs(course):
            # - if the course is in visiting, means loop found
            if status_list[course] == 1: return False

            # - if the course is visited, it is ok
            if status_list[course] == 2: return True

            # - set status as visiting
            status_list[course] = 1

            # - traverse all next courses if has them
            if course in g:
                for c in g[course]:
                    if not dfs(c): return False

            # - set status as visited
            status_list[course] = 2

            return True

        # - check all courses
        for course in g:
            if not dfs(course): 
                return False

        return True

Supongo que te gusta

Origin www.cnblogs.com/journeyonmyway/p/12702667.html
Recomendado
Clasificación