9 {
10 unordered_map<int, list<int>> prereq_map;
11 for (vector<int>& node_prereq: prerequisites)
12 {
13 int node = node_prereq[0];
14 for (int i = 1; i < (int)node_prereq.size(); ++i)
15 (prereq_map[node]).push_back(node_prereq[i]);
16 }
17
18 set<int> visited;
19 set<int> rec_stk;
20 stack<int> node_stack;
21
22 int n = numCourses;
23 for (int i = 0; i < n; ++i)
24 {
25 if (visited.find(i) == visited.end())
26 {
27 node_stack.push(i);
28 while (!node_stack.empty())
29 {
30 int node = node_stack.top();
31 if (rec_stk.find(node) == rec_stk.end())
32 {
33 rec_stk.insert(node);
34 for (int neighbor : prereq_map[node])
35 {
36 if (rec_stk.find(neighbor) != rec_stk.end())
37 return false;
38 if (visited.find(neighbor) == visited.end())
39 node_stack.push(neighbor);
40 }
41 }
42 else
43 {
44 node_stack.pop();
45 rec_stk.erase(node);
46 visited.insert(node);
47 }
48 }
49 }
50 }
51 return true;
52 }