[Historia de BFS y DFS] LC207 - Programación del curso (gráfico acíclico paso a paso, la solución más fácil de entender en toda la red)

El tema es el siguiente

Inserte la descripción de la imagen aquí

Análisis del problema

En primer lugar, si se trata de un diagrama de anillo, entonces es imposible aprender, como
matemáticas y chino. Para aprender matemáticas, primero debe aprender chino, y para aprender chino, primero debe aprender matemáticas, por lo que no puede aprenderlo.

输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
*********************************************************
输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
输出:false
解释:总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。

La
idea principal del tema Debe tomar numCourse como un curso electivo este semestre, que se registra como 0 a numCourse-1.

Se requieren algunos cursos de prerrequisito antes de tomar ciertos cursos. Por ejemplo, si desea estudiar el curso 0, primero debe completar el curso 1. Usamos 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.

Análisis de pensamiento

  1. Primero aprenda lecciones que no necesita aprender otros cursos
  2. Después de aprender, termine ++, necesitará aprender el grado de este curso, si = 0, únase al equipo y espere para aprender
  3. Si finaliza el curso de estudio == numCourses, devuelve verdadero
class Solution {
    
    
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
    
    
        vector<vector<int>> neibors(numCourses);
        vector<int> degree(numCourses,0);
        for(vector<int> iter:prerequisites){
    
    
            ++degree[iter[0]];
            neibors[iter[1]].push_back(iter[0]);
        }
        queue<int> courseID;
        for(int i=0;i<numCourses;i++){
    
    
            if(degree[i]==0)
                courseID.push(i);
        }
        int finish=0;
        while(!courseID.empty()){
    
    
            int id=courseID.front();courseID.pop();
            finish++;
            for(int i=0;i<neibors[id].size();i++){
    
    
                degree[neibors[id][i]]--;
                if(degree[neibors[id][i]]==0){
    
    
                    courseID.push(neibors[id][i]);
                }
            }
        }
        return finish==numCourses;
    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_42136832/article/details/114588200
Recomendado
Clasificación