207. Course Schedule
来源:互联网 发布:游戏帧数测试软件 编辑:程序博客网 时间:2024/06/04 01:29
207. Course Schedule
There are a total of n courses you have to take, labeled from
0
ton - 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
- 207.Course Schedule
- Leetcode 207. Course Schedule
- 207. Course Schedule
- 207. Course Schedule LeetCode
- 207. Course Schedule
- leetcode 207. Course Schedule
- 207. Course Schedule
- leetcode.207. Course Schedule
- LeetCode 207. Course Schedule
- 【LeetCode】207. Course Schedule
- 207. Course Schedule
- 207. Course Schedule
- 207. Course Schedule
- [leetcode] 207. Course Schedule
- leetcode-207. Course Schedule
- 207. Course Schedule
- 207. Course Schedule
- Java 根据模板导出Excel时,如何根据后台数据设置复选框的勾选
- Qt设置无边框窗口,窗口透明度
- apt-get update 和 upgrade 的区别
- Gradle Transform
- 常见字符串常量和表达式
- 207. Course Schedule
- kdb5_util: Configuration file does not specify default realm while getting default realm
- 关于matlab学习的部分笔记(一)
- android源码函数学习之basename与dirname
- easyui datagrid在fitColumns="true"的情况下失效
- Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
- 高级指针
- mysql索引总结
- .9 图片讲解