【関連問題】
考え方
「数字を頂点」,「順序関係を辺」と考えればグラフの問題になる.求められているものは,トポロジカルソートしたもので,辞書順で最小のものであるとわかる.
(トポロジカルソートについて:トポロジカルソート - 競プロはじめました)
つまり,(キューに入っている頂点に関し)入次数が同じなら,数字が小さいものを優先して取り出せばよい.これは,heapq
を使えば良い.
回答例
import heapq N, M = map(int, input().split()) G = [[] for _ in range(N)] indeg = [0] * N for _ in range(M): A, B = map(int, input().split()) A -= 1 B -= 1 G[A].append(B) indeg[B] += 1 q = [] for i in range(N): if indeg[i] == 0: heapq.heappush(q, i) ans = [] while q: cur = heapq.heappop(q) ans.append(cur + 1) for chi in G[cur]: indeg[chi] -= 1 if indeg[chi] == 0: heapq.heappush(q, chi) print(*ans if len(ans) == N else [-1])