Source code for titan_pylib.graph.topological_sort

 1from heapq import heapify, heappush, heappop
 2
 3# len(toposo) != n: 閉路が存在
 4
 5
[docs] 6def topological_sort_min(G: list[list[int]]) -> list[int]: 7 n = len(G) 8 d = [0] * n 9 F = [[] for _ in range(n)] 10 for i in range(n): 11 for x in G[i]: 12 d[x] += 1 13 F[x].append(i) 14 hq = [i for i, a in enumerate(d) if not a] 15 heapify(hq) 16 ret = [] 17 while hq: 18 v = heappop(hq) 19 ret.append(v) 20 for x in F[v]: 21 d[x] -= 1 22 if d[x] == 0: 23 heappush(hq, x) 24 return ret
25 26
[docs] 27def topological_sort(G: list[list[int]]) -> list[int]: 28 """Return topological_sort. / O(|V|+|E|)""" 29 n = len(G) 30 d = [0] * n 31 outs = [[] for _ in range(n)] 32 for v in range(n): 33 for x in G[v]: 34 d[x] += 1 35 outs[v].append(x) 36 res = [] 37 todo = [i for i in range(n) if d[i] == 0] 38 while todo: 39 v = todo.pop() 40 res.append(v) 41 for x in outs[v]: 42 d[x] -= 1 43 if d[x] == 0: 44 todo.append(x) 45 return res