##拓扑排序:只有把事情做完了才做下一个事情,只有当这个事情前面的事情都做完了才会被做,安排文件


课程表

class Solution {
public:
    bool canFinish(int numCourses, vector>& prerequisites) 
    {
        int n = prerequisites.size();
        // 没有依赖关系,必然能完成所有课程的学习
        if (n == 0) return true;
        vector indegree(numCourses);           // 每个节点的入度
        vector > adjacency(numCourses); // 邻接矩阵:先修课程-->(后续课程集合)
        queue help;                            // 辅助队列,存放入度为0的节点
        // 统计所有节点的入度,构建邻接矩阵
        for (int i = 0; i < n; i++)
        {
            indegree[prerequisites[i][0]]++;
            adjacency[prerequisites[i][1]].push_back(prerequisites[i][0]);//装入他的后续课程,方便以后操作减1
        }
        // 将所有入度为0的节点加入队列,入度为0的节点意味着没有先修课程的自由课程
        for (int i = 0; i < numCourses; i++)
        {
            if (indegree[i] == 0)//遍历寻找入度为0的点全部放入,
                help.push(i);
        }
        int count = 0;                              // 已学的课程数
        while (!help.empty())//非空
        {
            int visited = help.front();             // 当前学习的课程
            count++;//学的课程++
            help.pop();                             // 学完,出队
            // 将刚学完的课程的所有后续课程的入度减一
            for (int i = 0; i < adjacency[visited].size(); i++)
            {
                indegree[adjacency[visited][i]]--;//后序课程入度减少
                // 发现如果有后续课程的入度减为零了,则其变为了自由课程,加入队列
                if (indegree[adjacency[visited][i]] == 0)//
                    help.push(adjacency[visited][i]);
            }
        }
        // 如果可以学完的课程数=课程总数则返回true,否则返回false
        return count == numCourses;//





相关