Fork me on GitHub

Course Schedule

Description

https://leetcode.com/problems/course-schedule/description/

Stupid Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
unordered_map<int, unordered_set<int> > adj;
for (auto& pa : prerequisites) {
adj[pa.first].insert(pa.second);
}
for (int i = 0; i < numCourses; ++i)
if (adj.find(i) == adj.end())
for (auto iter = adj.begin(); iter != adj.end(); ++iter)
iter->second.erase(i);

while(!adj.empty()) {
bool flag = false;
auto iter = adj.begin();
while(iter != adj.end()) {
auto cur = iter;
++iter;
if (cur->second.empty()) {
flag = true;
int key = cur->first;
adj.erase(cur);
for (auto it = adj.begin(); it != adj.end(); ++it)
it->second.erase(key);
}
}
if (!flag && !adj.empty()) return false;
}
return true;
}
};

Reasonable Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> degree(numCourses, 0);
vector<vector<int>> graph(numCourses, vector<int>() );
for (auto& pa : prerequisites) {
degree[pa.first] += 1;
graph[pa.second].push_back(pa.first);
}
stack<int> waitingList;
for (int i = 0; i < numCourses; ++i) {
if (degree[i] == 0){
waitingList.push(i);
}
}
while (!waitingList.empty()) {
int item = waitingList.top();
waitingList.pop();
vector<int>& lis = graph[item];
for (int item : lis) {
--degree[item];
if (degree[item] == 0) {
waitingList.push(item);
}
}
}

for (int i = 0; i < numCourses; ++i)
if (degree[i] != 0) return false;

return true;
}
};