leetcode-华为专题-207. 课程表

 

 

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {

        if(numCourses==0)
            return false;

        vector<vector<int>> edge(numCourses);  // 保存边的连接信息
        vector<int> index(numCourses);  // 保存入度信息

        for(int i = 0; i < prerequisites.size(); i++){
            // 保存修完课程a, 可以修的其余所有课程
            edge[prerequisites[i][1]].push_back(prerequisites[i][0]);
            index[prerequisites[i][0]]++;  // 入度加一
        }

        queue<int> q;
        for(int i = 0; i < numCourses; i++){
            if(index[i]==0)
                q.push(i);  // 将入度为0的节点加入队列
        }

        int res = 0;
        while(!q.empty()){
            vector<int> tmp;
            res++;
            tmp = edge[q.front()];
            q.pop();
            for(int i = 0; i < tmp.size(); i++){
                index[tmp[i]]--; // 将与刚才弹出节点相连的节点入度全部减1
                if(index[tmp[i]]==0)
                    q.push(tmp[i]);
            }
            
        }

        if(res==numCourses)
            return true;
        else 
            return false;
    }
};

 

posted @ 2021-08-19 14:09  三一一一317  阅读(102)  评论(0)    收藏  举报