首页 > 其他 > 详细

leetcode207 课程表(Medium)

时间:2020-07-21 22:17:01      阅读:77      评论:0      收藏:0      [点我收藏+]

题目来源:leetcode207 课程表

题目描述:

你这个学期必须选修 numCourse 门课程,记为?0?到?numCourse-1 。

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

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

示例 1:

输入: 2, [[1,0]]
输出: true
解释:?总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

示例 2:

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

提示:

输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。
你可以假定输入的先决条件中没有重复的边。
1 <=?numCourses <= 10^5

解题思路:

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
       vector<vector<int>> graph(numCourses,vector<int>());//邻接表,记录一个结点的后继
       vector<int> in(numCourses,0);//入度
       for(int i=0;i<prerequisites.size();i++){
           graph[prerequisites[i][1]].push_back(prerequisites[i][0]);
           ++in[prerequisites[i][0]];
       }
       queue<int> q;
       int i=0,num=0;
       //入度为0的结点入队
       for(i=0;i<numCourses;i++){
           if(in[i]==0){
               q.push(i);
               num++;
           } 
       }
       while(!q.empty()){
           int t=q.front();
           q.pop();
           //入度为0的所有后继结点的入度-1
           for(i=0;i<graph[t].size();i++){
               in[graph[t][i]]--;
               //如果新得到入度为0的,也加入队列
               if(in[graph[t][i]]==0){
                   q.push(graph[t][i]);
                   num++;//记录入度为0的个数
               } 
           }
       }
       //最后所有的结点的入度都为0,如果个数不满足,则返回false,否则返回true
       if(num==numCourses) return true;
       else  return false;
    }
};

leetcode207 课程表(Medium)

原文:https://www.cnblogs.com/yjcoding/p/13356855.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!