[LeetCode] 207. Course Schedule
来源:互联网 发布:网络变压器品牌 编辑:程序博客网 时间:2024/06/08 14:24
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.
You may assume that there are no duplicate edges in the input prerequisites.
click to show more hints.
Hints:
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.
Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort.
Topological sort could also be done via BFS.
// 本质上就是有向图中的有向环检测class Solution {public: bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { if (prerequisites.size() < 2) return true; vector<vector<int>> adjs(numCourses); for (auto& prerequisite : prerequisites) adjs[prerequisite.second].push_back(prerequisite.first); HasCyclc = false; marked = vector<bool>(numCourses, false); OnStack = vector<bool>(numCourses, false); for (int i = 0; i < marked.size(); i++) if (!marked[i]) DFS(adjs, i); return !HasCyclc; }private: bool HasCyclc; vector<bool> marked; vector<bool> OnStack; void DFS(vector<vector<int>>& adjs, int v) { marked[v] = true; OnStack[v] = true; for (auto w : adjs[v]) { if (HasCyclc) return; else if (!marked[w])DFS(adjs, w); else if (OnStack[w]) HasCyclc = true; } OnStack[v] = false; }};
- [leetcode] 207.Course Schedule
- Leetcode 207. Course Schedule
- 207. Course Schedule LeetCode
- leetcode 207. Course Schedule
- leetcode.207. Course Schedule
- LeetCode 207. Course Schedule
- 【LeetCode】207. Course Schedule
- [leetcode] 207. Course Schedule
- leetcode-207. Course Schedule
- leetcode 207. Course Schedule
- [LeetCode] 207. Course Schedule
- 【Leetcode】207. Course Schedule
- Leetcode 207. Course Schedule
- LeetCode 207.Course Schedule
- Leetcode 207. Course Schedule
- Leetcode 207. Course Schedule
- [LeetCode]207. Course Schedule
- Leetcode 207. Course Schedule
- 带你一步步走入Paxos的世界 -- 序列1
- 虚拟机Linux系统的MySQL在本地的Navicat连不上
- 树莓派-可以适应显示器的boot/config.txt配置
- kNN_手写识别系统代码实现
- 个人总结与目标
- [LeetCode] 207. Course Schedule
- linux定时任务计划contab
- C++中虚继承的作用及底层实现原理
- HDU 2546 饭卡(01背包)
- grpc简易教程 go server+php client
- Javaweb基础----过滤器filter(转发)
- Ubuntu16.04安装QQ在处理时有错误发生: wine-qqintl
- 视频检测之:GOSUS算法 —— Grassmannian Online Subspace Updates with Structured-sparsity
- 关于排序算法(持续更新)