def topological_sort(edges):
indegree = {u: 0 for u in edges}
for u in edges:
for v in edges[u]:
indegree[v] += 1
queue = [u for u in edges if indegree[u] == 0]
ans = []
for u in queue:
ans.append(u)
for v in edges[u]:
indegree[v] -= 1
if indegree[v] == 0:
queue.append(v)
return ans if len(ans) == len(edges) else None
def topological_sort(self, edges):
NOT_VISITED = 1
OPEN = 2
CLOSED = 4
status = {u: NOT_VISITED for u in edges}
ans = []
def dfs(u):
if status[u] == CLOSED:
return True
if status[u] == OPEN:
return False
status[u] = OPEN
for v in edges.get(u, []):
if not dfs(v):
return False
ans.append(u)
status[u] = CLOSED
return True
for c in status:
if status[c] == NOT_VISITED:
if not dfs(c):
return False
ans.reverse()
return ans