leetcode-207. 课程表

 

 

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> edge;
        vector<int> index;
        edge.resize(numCourses); // resize()操作:创建指定数量的的元素并指定vector的存储空间
        index.resize(numCourses);

        for(int i = 0; i < prerequisites.size(); i++){
            edge[prerequisites[i][1]].push_back(prerequisites[i][0]);
            // [0,1] 构成边1->0  代表修完课程1才能修课程0
            index[prerequisites[i][0]]++;
            // 课程0的入度加1
        }
        queue<int> q;
        for(int i = 0; i < numCourses; i++){
            // 如果课程的入度为0,则加入队列
            if(index[i]==0)
                q.push(i);
        }

        int res = 0;
        while(!q.empty()){
            res++;
            int tmp = q.front();  // 获得队头元素
            q.pop();  // 弹出队头元素
            vector<int> vec;
            vec = edge[tmp];  // 获得队头元素连接的其余所有顶点
            for(int i = 0; i < vec.size(); i++){
                index[vec[i]]--;  // 其余顶点的入度剪1
                if(index[vec[i]]==0)
                    q.push(vec[i]);  // 如果其余顶点的入度为0,则加入队列
            }
            
        }
        if(res==numCourses)  // 如果出队的元素个数等于课程个数,则返回true
            return true;
        else
            return false;

    }
};

 

posted @ 2021-07-22 20:11  三一一一317  阅读(48)  评论(0)    收藏  举报