From : https://leetcode.com/problems/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.
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.
class Solution {
public :
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<set<int>> posts(numCourses); //邻接表
vector<int> preNums(numCourses, 0); //记录前驱的个数
for(int i = 0; i < numCourses; i++) posts[i] = set<int>();
for(int i = prerequisites.size()-1; i >= 0 ; i--) {
posts[prerequisites[i].second].insert(prerequisites[i].first);
}
for(int i=0; i<numCourses; i++) {
// 之所以不在上面循环做,是因为pair是由重复的
for(auto &a : posts[i]) {
preNums[a]++;
}
}
// remove a non-pre course each time
for(int i=0; i<numCourses; i++) {
int j = 0;
while(j < numCourses) {
if(preNums[j] == 0) break;
j++;
}
if(j == numCourses) break;
preNums[j] = -1;
for(auto &a : posts[j]) {
preNums[a]--;
}
}
for(int i=0; i<numCourses; i++) {
if(preNums[i] > 0) return false;
}
return true;
}
};
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<set<int>> posts(numCourses); //邻接表
vector<int> preNums(numCourses, 0); //记录前驱的个数
queue<int> q;
for(int i = prerequisites.size()-1; i >= 0 ; i--) {
posts[prerequisites[i].second].insert(prerequisites[i].first);
}
for(int i=0; i<numCourses; i++) {
// 之所以不在上面循环做,是因为pair是由重复的
for(auto &a : posts[i]) {
preNums[a]++;
}
}
for (int i = 0; i < numCourses; i++) {
if (preNums[i] == 0){
q.push(i);
}
}
int count = numCourses;
while (!q.empty()) {
int idx = q.front();
q.pop();
for (int i : posts[idx]) {
if (--preNums[i] == 0) {
q.push(i);
}
}
count--;
}
return count == 0;
}
};