Skip to content

Commit b9e8ced

Browse files
committed
feat: WIP leetcode/leetcoding_challenge/2025/jan2025/week4/course_schedule_iv.cpp
1 parent 8670873 commit b9e8ced

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#include <algorithm>
2+
#include <vector>
3+
#include <queue>
4+
#include <set>
5+
#include <limits>
6+
#include <map>
7+
#include <unordered_set>
8+
#include <unordered_map>
9+
#include <iterator>
10+
#include <sstream>
11+
#include <iostream> // includes cin to read from stdin and cout to write to stdout
12+
using namespace std; // since cin and cout are both in namespace std, this saves some text
13+
14+
class Solution {
15+
public:
16+
vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
17+
// TODO: validate there are no cycles
18+
19+
vector<int> indegrees(numCourses, 0);
20+
vector<unordered_set<int>> nextCourses(numCourses, unordered_set<int>());
21+
vector<unordered_set<int>> allPrerequisites(numCourses, unordered_set<int>());
22+
for (auto& prerequisite: prerequisites) {
23+
auto first = prerequisite[0];
24+
auto after = prerequisite[1];
25+
26+
indegrees[after]++;
27+
nextCourses[first].insert(after);
28+
allPrerequisites[after].insert(first);
29+
}
30+
31+
deque<int> q;
32+
for (auto i = 0; i < numCourses; ++i) {
33+
if (indegrees[i] == 0) {
34+
q.push_back(i);
35+
}
36+
}
37+
38+
while (q.size() == 0) {
39+
auto course = q.front();
40+
q.pop_front();
41+
42+
for (auto n: nextCourses[course]) {
43+
for (auto r: allPrerequisites[course]) {
44+
allPrerequisites[n].insert(r);
45+
}
46+
47+
indegrees[n]--;
48+
if (indegrees[n] == 0) {
49+
q.push_back(n);
50+
}
51+
}
52+
}
53+
54+
vector<bool> answer;
55+
for (auto& query: queries) {
56+
auto u = query[0];
57+
auto v = query[1];
58+
59+
auto isPrerequisites = allPrerequisites[v].count(u) > 0;
60+
answer.push_back(isPrerequisites);
61+
}
62+
63+
return answer;
64+
}
65+
};
66+
67+
class WASolution {
68+
public:
69+
vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
70+
// TODO: validate there are no cycles
71+
72+
vector<int> outdegrees(numCourses, 0);
73+
vector<unordered_set<int>> parents(numCourses, unordered_set<int>());
74+
vector<unordered_set<int>> allPrerequisites(numCourses, unordered_set<int>());
75+
for (auto& prerequisite: prerequisites) {
76+
auto first = prerequisite[0];
77+
auto after = prerequisite[1];
78+
79+
outdegrees[first]++;
80+
parents[after].insert(first);
81+
allPrerequisites[after].insert(first);
82+
}
83+
84+
deque<int> q;
85+
for (auto i = 0; i < numCourses; ++i) {
86+
if (outdegrees[i] == 0) {
87+
q.push_back(i);
88+
}
89+
}
90+
91+
while (q.size() == 0) {
92+
auto course = q.front();
93+
q.pop_front();
94+
95+
for (auto p: parents[course]) {
96+
for (auto r: allPrerequisites[course]) {
97+
allPrerequisites[p].insert(r);
98+
}
99+
100+
outdegrees[p]--;
101+
if (outdegrees[p] == 0) {
102+
q.push_back(p);
103+
}
104+
}
105+
}
106+
107+
vector<bool> answer;
108+
for (auto& query: queries) {
109+
auto u = query[0];
110+
auto v = query[1];
111+
112+
auto isPrerequisites = allPrerequisites[v].count(u) > 0;
113+
answer.push_back(isPrerequisites);
114+
}
115+
116+
return answer;
117+
}
118+
};

0 commit comments

Comments
 (0)