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.
My Solution:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int> >& prerequisites) {
int indegrees[numCourses];
for (int i = 0; i < numCourses; i++) {
indegrees[i] = 0;
}
for (int i = 0; i < prerequisites.size(); i ++) {
indegrees[prerequisites[i].second] ++;
}
vector<int> emptyIndegrees;
for (int i = 0; i < numCourses; i ++) {
if(indegrees[i] == 0) {
emptyIndegrees.push_back(i);
}
}
while(emptyIndegrees.size() != 0) {
int course = emptyIndegrees.back();
emptyIndegrees.pop_back();
for (vector<pair<int, int> >::iterator iter = prerequisites.begin(); iter != prerequisites.end();) {
pair<int, int> p = (*iter);
if((*iter).first == course) {
indegrees[(*iter).second] --;
if(indegrees[(*iter).second] == 0) {
int x = (*iter).second;
emptyIndegrees.push_back((*iter).second);
}
iter = prerequisites.erase(iter);
continue;
}
iter ++;
}
}
return prerequisites.empty();
}
};