LeetCode207. Course Schedule
2017-03-19 14:53
465 查看
题目来源:LeetCode207. Course Schedule
原题:
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.
For example: 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.
分析题意可以知道我们需要根据给定的课程数目,以及两两相对顺序来判断所有课程是否可以构成一个能依次进行的课程。
由此我们可以很容易联想到图论当中的拓扑排序,给定的两两相对顺序是图的边,给定的课程是图的点。若图能够拓扑排序,则返回yes,否则返回false。
具体代码如下:
原题:
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.
For example: 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.
分析题意可以知道我们需要根据给定的课程数目,以及两两相对顺序来判断所有课程是否可以构成一个能依次进行的课程。
由此我们可以很容易联想到图论当中的拓扑排序,给定的两两相对顺序是图的边,给定的课程是图的点。若图能够拓扑排序,则返回yes,否则返回false。
具体代码如下:
struct graph{ int vexs; int sides; vector<list<int>> arc; graph(int v = 0, int s = 0){ vexs = v; sides = s; arc.resize(v); } }; class Solution { public: bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { graph G(numCourses,prerequisites.size()); vector<int> ind(numCourses,0); for(vector<pair<int, int> >::iterator it = prerequisites.begin(); it != prerequisites.end(); it ++){ G.arc[(*it).first].push_back((*it).second); ind[(*it).second]++; } int count = 0; stack<int> s; for(int i = 0; i < numCourses; i++){ if(ind[i] == 0){ count++; s.push(i); ind[s.top()] = -1; // avoid to be accessed repeatedly } } while(!s.empty()){ for(list<int>::iterator it = G.arc[s.top()].begin(); it != G.arc[s.top()].end(); it ++){ ind[*it]--; } s.pop(); for(int i = 0;i < numCourses; i++){ if(ind[i] == 0){ count++; s.push(i); ind[s.top()] = -1; // avoid to be accessed repeatedly } } } if(count == numCourses)return true; else return false; } };
相关文章推荐
- [leetcode] 207. Course Schedule
- 第十二周 leetcode 207. Course Schedule(Medium)
- Leetcode 207. Course Schedule
- 【LeetCode】207. Course Schedule (2 solutions)
- 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 (Medium)
- LeetCode *** 207. Course Schedule (Topological Sort )
- [LeetCode]207. Course Schedule
- 第四周:[Leetcode]207. Course Schedule