DFS:
class Solution {public: vector res; bool detectedCycle = false; vector findOrder(int n, vector>& pres) { if (n < 1) return res; vector > v(n); for (const auto& p : pres) v[p.second].insert(p.first); vector visited(n, -1); for (int i = 0; i < n; i++) dfs(v, visited, i); reverse(res.begin(), res.end()); // result in reverse order return detectedCycle ? vector () : res; } void dfs(vector >& v, vector & visited, int n) { if (detectedCycle || visited[n] != -1) return; visited[n] = 1; for (int i : v[n]) { if (visited[i] == 1) detectedCycle = true; else if (visited[i] == 2) continue; else dfs(v, visited, i); } visited[n] = 2; res.push_back(n); // push current node to the end, and final result is in reverse order. }};
Topological sort:
class Solution {public: vector findOrder(int n, vector>& pres) { vector res; if (n < 1) return res; vector > v(n); vector d(n, 0); // in-degree of each node for (const auto& p : pres) { v[p.second].insert(p.first); d[p.first]++; } for (int k = 0; k < n; k++) { int cur = 0; // find a v which indegree is 0, then we can delete it while (cur < n && d[cur] != 0) cur++; if (cur == n) { return vector (); } for (auto nb : v[cur]) d[nb]--; res.push_back(cur); d[cur] = -1; } return res; }};