207. Course Schedule
2017-09-25 10:48
393 查看
207. Course Schedule
There are a total of n courses you have to take, labeled from0to
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.
题目大意
前提:有部分课程需要以另一门课程为前提,如果存在两门课互为前提,则该课程信息不可完成;如果不存在,则该课程信息可完成。输入课程信息,判断该课程信息能否完成。
解题思路
这是一个拓扑排序问题。遍历有向图中的节点,每次找到一个入度为0的节点,将其push进队列。然后利用BFS,取队列的头(并将其pop掉),将该节点所指向其他节点的边都去掉(即,将其指向的节点入度减一),如果存在节点入度减一的值为零,则将其push入队列,重复这个过程,直到队列为空。
最后检查送队列中被pop掉的节点总数,如果总数等于课程数量,则说明该有向图无环,课程信息可完成;如果总数小于课程数量,则说明该有向图存在环,课程信息不可完成。
算法复杂度
O(|V+E|)代码实现
class Solution { public: bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<int> inDegreeMap(numCourses); vector<pair<int,int>>::iterator iter; // compute the in-degree of all points for (iter = prerequisites.begin(); iter != prerequisites.end(); iter++) { ++inDegreeMap[iter->second]; } // push back the 0-inDegree point to the queue queue<int> que; for (int i = 0; i < numCourses; ++i) { if (inDegreeMap[i] == 0) { que.push(i); } } // BFS int count = que.size(); while (!que.empty()) { int u = que.front(); que.pop(); for (iter = prerequisites.begin(); iter != prerequisites.end(); iter++) { if (u == iter->first) { // find the next position of u // and determine whether its (in-degree - 1) equals 0 int uLast = iter->second; if (--inDegreeMap[uLast] == 0) { que.push(uLast); ++count; } } } } return count == numCourses; } };
相关文章推荐
- [leetcode] 207. Course Schedule 解题报告
- Leetcode 207. Course Schedule & 210. Course Schedule II
- 207. Course Schedule
- leetcode 207. Course Schedule
- 207. Course Schedule
- 207. Course Schedule
- 【LeetCode】207. Course Schedule (2 solutions)
- LeetCode *** 207. Course Schedule (Topological Sort )
- 207. Course Schedule
- 207. Course Schedule
- 第十二周 leetcode 207. Course Schedule(Medium)
- leetcode 207. Course Schedule 课程调度 + 拓扑排序
- 207. Course Schedule
- Leetcode 207. Course Schedule
- 207. Course Schedule
- 207. Course Schedule
- [LeetCode]207. Course Schedule
- 207. Course Schedule
- Leetcode:207. Course Schedule
- 207. Course Schedule