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
| class Solution { public: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) { n = numCourses; visited.resize(n); g.resize(n); for (const auto &p : prerequisites) { g[p.second].push_back(p.first); } for (int i = 0; i < n; ++i) { if (dfs(i)) return {}; } vector<int> res; while (!s.empty()) { res.push_back(s.top()); s.pop(); } return res; }
bool dfs(int c) { if (visited[c] == 1) return false; if (visited[c] == -1) return true; visited[c] = -1; for (auto child : g[c]) { if (dfs(child)) return true; } visited[c] = 1; s.push(c); return false; }
int n; vector<int> visited; stack<int> s; vector<vector<int>> g; };
|