[Histoire de BFS et DFS] LC207 - Calendrier des cours (graphe acyclique pas à pas, la solution la plus facile à comprendre sur tout le réseau)

Le sujet est le suivant

Insérez la description de l'image ici

Analyse du problème

Tout d'abord, s'il s'agit d'un diagramme en anneau, il est impossible d'apprendre, comme les
mathématiques et le chinois. Pour apprendre les mathématiques, vous devez d'abord apprendre le chinois, et pour apprendre le chinois, vous devez d'abord apprendre les mathématiques, donc vous ne pouvez pas apprend le.

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

L'
idée principale du sujet Vous devez suivre numCourse comme cours optionnel ce semestre, qui est enregistré de 0 à numCourse-1.

Certains cours préalables sont requis avant de suivre certains cours. Par exemple, si vous voulez étudier le cours 0, vous devez d'abord terminer le cours 1. Nous utilisons une correspondance pour les représenter: [0,1]

Compte tenu du nombre total de cours et de leurs prérequis, veuillez juger s'il est possible de suivre tous les cours?

Analyse de la pensée

  1. Apprenez d'abord des leçons qui n'ont pas besoin d'apprendre d'autres cours
  2. Après avoir appris, terminez ++, vous devrez apprendre le diplôme de ce cours, si = 0, rejoignez l'équipe et attendez d'apprendre
  3. Si terminer le cours d'étude == numCourses, alors renvoie true
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;
    }
};

Je suppose que tu aimes

Origine blog.csdn.net/qq_42136832/article/details/114588200
conseillé
Classement