-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path210. Course Schedule II.cpp
101 lines (93 loc) · 3.52 KB
/
210. Course Schedule II.cpp
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
// the response
vector<int> res;
if (numCourses == 0) return res;
res.reserve(numCourses);
//
// graph representation: O(prerequisites.size())
//
vector<int> *edges_stt_tgtIdx = new vector<int>[numCourses];
vector<int> *edges_end_oriIdx = new vector<int>[numCourses];
int *cTgts = new int[numCourses]();
int *cOris = new int[numCourses]();
bool *asFirst = new bool[numCourses](); // for queue initialization
for (int i = 0; i < prerequisites.size(); i++) {
edges_stt_tgtIdx[prerequisites[i].second].push_back(prerequisites[i].first);
cTgts[prerequisites[i].second]++;
edges_end_oriIdx[prerequisites[i].first].push_back(prerequisites[i].second);
cOris[prerequisites[i].first]++;
asFirst[prerequisites[i].first] = true;
}
//
// try finding a directed cycle
//
int *cOris2 = new int[numCourses]();
for (int i = 0; i < numCourses; i++) cOris2[i] = cOris[i];
bool *closed = new bool[numCourses]();
int node_0indeg = -1;
for (int i = 0; i < numCourses; i++) {
if (!closed[i] && cOris2[i] == 0) { node_0indeg = i; break; }
}
while (node_0indeg != -1) { // an open 0-degree node found
for (int i = 0; i < cTgts[node_0indeg]; i++) { // every target of the 0-degree node
cOris2[edges_stt_tgtIdx[node_0indeg][i]]--;
}
closed[node_0indeg] = true;
node_0indeg = -1;
for (int i = 0; i < numCourses; i++) {
if (!closed[i] && cOris2[i] == 0) { node_0indeg = i; break; }
}
}
// decide whether there still is an open
for (int i = 0; i < numCourses; i++) {
if (!closed[i]) return res;
}
delete[] cOris2;
delete[] closed;
//
// bfs: O(numCourses)
//
bool *visited = new bool[numCourses]();
// queue initialization
queue<int> q;
for (int i = 0; i < numCourses; i++) { // every node i
if (!asFirst[i]) {
q.push(i);
visited[i] = true;
res.push_back(i);
}
}
delete[] asFirst;
// run bfs
while (q.size()) {
int node = q.front();
q.pop();
// visit targets
for (int i = 0; i < cTgts[node]; i++) { // the i-th target
int target = edges_stt_tgtIdx[node][i];
if (!visited[target]) {
bool all_oris_visited = true;
for (int j = 0; j < cOris[target]; j++) { // the j-th origin of target
if (!visited[edges_end_oriIdx[target][j]]) {
all_oris_visited = false;
break;
}
}
if (all_oris_visited) {
q.push(target);
visited[target] = true;
res.push_back(target);
}
}
}// for: the i-th target
}
// clean and return
delete[] edges_stt_tgtIdx;
delete[] edges_end_oriIdx;
delete[] cTgts, cOris;
delete[] visited;
return res;
}
};