[leetcode] 207. Course Schedule

转载 2016年08月29日 08:24:56

There are a total of n courses you have to take, labeled from 0 to n - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

For example:

2, [[1,0]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

2, [[1,0],[0,1]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.

Note:
The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.

Hints:

  1. This problem is equivalent to finding if a cycle exists in a directed graph. If a cycle exists, no topological ordering exists and therefore it will be impossible to take all courses.
  2. Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort.
  3. Topological sort could also be done via BFS.

解法一:

BFS 实现topological sort。

class Solution {
public:
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<vector<int>> graph(numCourses, vector<int>(0));
        vector<int> in_degree(numCourses,0);
        
        // initilize in-degree
        for(auto a:prerequisites){
            graph[a.second].push_back(a.first);
            in_degree[a.first]++;
        }
        
        queue<int> q;
        for(int i=0; i<numCourses;i++){
            if(in_degree[i]==0) q.push(i);
        }
        
        while(!q.empty()){
            int k = q.front();
            q.pop();
            for(auto a:graph[k]){
                in_degree[a]--;
                if(in_degree[a]==0) q.push(a);
            }
        }
        
        for(int i=0; i<numCourses; i++){
            if(in_degree[i]!=0) return false;
        }
        return true;
    }
};

解法二:

class Solution {
public:
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<vector<int> > graph(numCourses, vector<int>(0));
        vector<int> visit(numCourses, 0); 
        // visit: 0 has not been visited
        //        1 has been visited
        //       -1 is being visited in current flow
        
        for(auto a:prerequisites){
            graph[a.second].push_back(a.first);
        }
        
        for(int i=0; i<numCourses; i++){
            if(!canFinish(graph, visit, i)) return false;
        }

        return true;
    }
    
    bool canFinish(vector<vector<int> >& graph, vector<int>& visit, int k){
        if (visit[k]==-1) return false;
        if (visit[k]==1) return true;
        
        visit[k]=-1;
        for(auto a:graph[k]){
            if(!canFinish(graph, visit, a)) return false;
        }
        
        visit[k] = 1;
        return true;
    }
};



判断有向图是否有环之拓扑排序-LeetCode 207. Course Schedule

拓扑排序:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性...
  • mengmee_pku
  • mengmee_pku
  • 2016年05月03日 15:44
  • 2221

【LeetCode】207. Course Schedule判断有向图是否有环

1、问题描述输入:n, [[1,0], [2,1], …., [n, n-1], [0,1], …..],假设没有重复的边 n表示总共0~n-1门课程,即n个节点 [1,0]表示先上课程0,才能上...
  • myangel_xy
  • myangel_xy
  • 2017年05月29日 10:03
  • 174

算法课第3周第2题——207. Course Schedule

题目描述: There are a total of n courses you have to take, labeled from 0 to n - 1. Some cours...
  • bwstardust
  • bwstardust
  • 2017年03月12日 03:56
  • 106

LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)

求有向图中是否有环。 法一:拓扑排序 用一个队列维护所有入度为0的节点,每次弹出一个节点v,查看从v可达的所有节点u; 将u的入读减一,若u的入度此时为0, 则将u加入队列。 在队列为空时,检查所有...
  • u014674776
  • u014674776
  • 2015年07月27日 17:10
  • 1783

算法练习(27):Course Schedule

题意:给出有向图,判断是否有环 分析与思路:题目看上去简单,但是没有一个套路还是挺难想的,求有向图是否有环,有一个思路清晰又实用的方法,就是用dfs遍历同时判断是否有回边,pre[node]和pos...
  • KingsonYing
  • KingsonYing
  • 2017年12月07日 23:30
  • 17

拓扑排序:课程表Course Schedule

There are a total of n courses you have to take, labeled from 0 to n - 1.Some courses may have prere...
  • gao1440156051
  • gao1440156051
  • 2016年05月31日 16:28
  • 687

leetcode Course Schedule系列问题,拓补排序,有向无环图

能进行拓补排序的图必须是有向无环图,直接用DFS判断图里面是否存在环,即不能存在回边,用两个时钟数组记录每个节点的进入时钟pre和返回时钟post,回边有这样的特性,如果一条边(u,v)是一条回边,那...
  • chenyaxue
  • chenyaxue
  • 2017年03月22日 09:54
  • 161

图论:出、入度,邻接表、邻接矩阵、拓扑排序\207. Course Schedule

出入度 邻接表邻接矩阵 拓扑排序 DFS Kahn算法出入度一般指的是在有向图(DAG)中,某个顶点,箭头指向它的为入度,从这个顶点出发,指向别的顶点的边就是出度。有几条这样的边,度就是多大。可以参考...
  • c602273091
  • c602273091
  • 2017年02月17日 15:37
  • 901

图的深度广度搜索简单训练:Course Schedule

先看题目: There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may ...
  • Ray_sysu
  • Ray_sysu
  • 2017年03月20日 11:18
  • 128

算法练习(28):Course Schedule II

题意:给出有向图,找出它的拓扑排序 分析与思路:同样还是Course Schedule I(上一个博客)的思路,只不过在每次访问完一个结点的时候把它push起来,为什么呢?因为拓扑排序实际上就是结点...
  • KingsonYing
  • KingsonYing
  • 2017年12月08日 00:16
  • 34
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[leetcode] 207. Course Schedule
举报原因:
原因补充:

(最多只允许输入30个字)