用bfs 前驱表后继表实现207. 课程表

//[[1,0]]表示学1之前要先学0

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int> vec(numCourses);//记录所有顶点的入度,未初始化的为0        // degrees(numCourses)声明并初始化为numC 个0
        vector<vector<int>> ans(numCourses); //邻接表
        queue<int> q;//零入度的顶点
        int num = numCourses;

        for (int i = 0; i < prerequisites.size(); i++) {
            vec[prerequisites[i][0]]++;//入顶点vec[i] 表示课程i有vec[i]门前驱
            ans[prerequisites[i][1]].push_back(prerequisites[i][0]);//出顶点 ans[i]表示课程i 有若干后继分别是ans[i][0]到ans[i][n]
        }//ans[0]push进一个1;表示 课程0有1个初度指向课程1
        for (int i = 0; i < numCourses; i++)
            if (vec[i] == 0) {//课程i没有前驱
                q.push(i); //入度为0的先入队列
                num--;
            }

        while (!q.empty()) {
            int temp = q.front();
            q.pop();//学习目前没有前驱的课程
            for (int j = 0; j < ans[temp].size(); j++)//ans[temp].size()表示课程temp有ans[temp].size()个后继
                if (--vec[ans[temp][j]] == 0) {//即课程ans[temp][j] 的前驱是否为0
                    q.push(ans[temp][j]);
                    num--;
                }
        }

        if (num == 0)
            return true;
        return false;
    }
};

 

posted @ 2022-03-22 20:27  Dsad123FFFG6645  阅读(29)  评论(0)    收藏  举报