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