Topological Sort

Python

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

Cited by 3