Leetcode 207. Course Schedule
2017-03-12 11:24
295 查看
Leetcode 207. Course Schedule
source url题目描述
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
0you 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?
输入:课程数量,以及各课程前序课程的pair
输出:是否能完成课程
如:
Input: 2, [[1,0]] 2, [[1,0],[0,1]] Output: true false Explain: 上述输入2中,两个课程互为前序课程,无法完成
思路
简单来说,这是判断有向图中是否产生环路。这里选择使用拓扑排序的方式来检查,如果无法完成拓扑排序,也就是该课程有向图中产生了环路,即无法完成。选用Kahn算法。
L← Empty list that will contain the sorted elements S ← Set of all nodes with no incoming edges while S is non-empty do remove a node n from S insert n into L foreach node m with an edge e from nto m do remove edge e from thegraph ifm has no other incoming edges then insert m into S if graph has edges then return error (graph has at least onecycle) else return L (a topologically sortedorder)
代码
class Solution { public: set<int> s; bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { int comingEdge[numCourses] = {0}; list<int> graph[numCourses]; int n,m;//node: n-e->m //build the list and counting comingEdge for(int i=0;i<prerequisites.size();i++){ n = prerequisites[i].second; m = prerequisites[i].first; //cout<<"m=="<<m<<" n=="<<n<<endl; comingEdge[m]++; graph .push_back(m); } //init Set S for(int i =0;i<numCourses;i++){ if(comingEdge[i]==0) s.insert(i); } while(!s.empty()){ int nodeN = *s.begin(); s.erase(nodeN); maintainSet(nodeN,graph[nodeN],comingEdge); } return isNoComingEdge(comingEdge,numCourses); } void maintainSet(int n, list<int>& graph,int* comingEdge){ //cout<<n<<" pop:"; while(graph.size()!=0){ int m = graph.front(); //cout<<m; graph.pop_front(); comingEdge[m]--; if(comingEdge[m]==0){ s.insert(m); } } //cout<<endl; } bool isNoComingEdge(int* comingEdge, int numCourses){ for(int i =0;i<numCourses;i++){ if(comingEdge[i]!=0){ //cout<<"i:"<<" "<<comingEdge[i]<<endl; return false; } } return true; } };
相关文章推荐
- Leetcode 207. Course Schedule
- Leetcode 207. Course Schedule
- LeetCode207. Course Schedule
- Leetcode:207. Course Schedule
- LeetCode 207. Course Schedule(课程安排)
- leetcode 207. Course Schedule
- leetcode 207. Course Schedule
- Leetcode 207. Course Schedule & 210. Course Schedule II
- LeetCode 207. Course Schedule
- LeetCode 207. Course Schedule(拓扑排序)
- LeetCode207. Course Schedule
- leetcode 207. Course Schedule 课程调度 + 拓扑排序
- leetcode 207. Course Schedule
- [leetcode] 207. Course Schedule
- 第十二周 leetcode 207. Course Schedule(Medium)
- 【LeetCode】207. Course Schedule (2 solutions)
- LeetCode 207. Course Schedule
- leetcode 207. Course Schedule
- [LeetCode] 207. Course Schedule
- [leetcode] 207. Course Schedule 解题报告