lc210-Course Schedule II 發表於 2016-08-21 | 分類於 leetcode | 0 comments | updated Dec 13: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950class graph { vector<unordered_set<int>> adj; int n; vector<int> temp_visited; vector<int> perm_visited; vector<int> sort_result;public: void add_edge(int u, int v) { adj[u].insert(v); } graph(int V, vector<pair<int, int>>& prerequisites):perm_visited(V, 0), temp_visited(V, 0), adj(V, unordered_set<int>()) { n = V; for (auto p:prerequisites) { add_edge(p.second, p.first); } } vector<int> topologicalSort() { for (int i = 0; i < n; i++) if (!perm_visited[i]) { dfs(i); if (sort_result.empty()) return sort_result; } reverse(sort_result.begin(), sort_result.end()); return sort_result; } void dfs(int cur) { if (perm_visited[cur]) return; temp_visited[cur] = 1; for (int next:adj[cur]) { if (temp_visited[next]) { sort_result = vector<int>(); return; } dfs(next); if (sort_result.empty()) return; } temp_visited[cur] = 0; perm_visited[cur] = 1; sort_result.push_back(cur); return; }};class Solution {public: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) { graph g(numCourses, prerequisites); return g.topologicalSort(); }}; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051class Solution(object): def findOrder(self, numCourses, prerequisites): """ :type numCourses: int :type prerequisites: List[List[int]] :rtype: List[int] """ def dfs(root): # print "root:",root marked = [0] * numCourses stack = [] stack.append(root) while stack: s = stack[-1] if visited[s]: stack.pop() if marked[s]: res.append(s) marked[s] = 0 else: visited[s] = 1 marked[s] = 1 if len(pre[s]) == 0: stack.pop() marked[s] = 0 res.append(s) continue for x in pre[s]: if x in stack and marked[x] == 1: return 0 stack.append(x) return 1 roots = range(numCourses) pre = [[]]*numCourses for i in range(numCourses): pre[i] = [] visited = [0]*numCourses res = [] for i in range(len(prerequisites)): # print "iter",i after = prerequisites[i][0] prev = prerequisites[i][1] if prev in roots: roots.remove(prev) pre[after].append(prev) for root in roots: if not dfs(root): return [] if 0 in visited: return [] return res