LeetCode-207. 课程表

题目描述 [课程表]

现在你总共有 n 门课需要选,记为 0 到 n-1。

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]

给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?

示例

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

解题思路

拓扑排序

  • 先构建邻接矩阵(邻接表更节约空间 下次再写把)并且计算每个点的入度
  • 从所有的点中,选取入度为0的点,放入队列
  • 出队列,将该点加入拓扑排序的保存数组中,并且将以这个点为头的边的尾节点的入度减1,如果该尾节点的入度为0则入队
  • 队列为空判断拓扑排序数组的个数是否和课程数相等,不等则有环

代码

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        if(prerequisites.size()==0) return true;
        vector<int> in(numCourses, 0);
        vector<vector<int> > edges(numCourses, vector<int>(numCourses, 0));

        for(int i=0;i<prerequisites.size();i++){
            edges[prerequisites[i][0]][prerequisites[i][1]] = 1;
            in[prerequisites[i][1]] ++;
        }
        queue<int> q;
        vector<int> res;

        for(int i=0;i<in.size();i++){
            if(in[i]==0) q.push(i);
        }

        while(!q.empty()){
            int i = q.front();
            q.pop();
            res.push_back(i);
            for(int j=0;j<numCourses;j++){
                if(edges[i][j]==1){
                        edges[i][j] = 0;
                    in[j]--;
                    if(in[j]==0) q.push(j);
                }
            }
        }
        return res.size()==numCourses;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容