ABC223D - Restricted Permutation


【関連問題】

考え方

「数字を頂点」,「順序関係を辺」と考えればグラフの問題になる.

求められているものは,トポロジカルソートしたもので,辞書順で最小のものであるとわかる.
(トポロジカルソートについて:トポロジカルソート - 競プロはじめました

つまり,(キューに入っている頂点に関し)入次数が同じなら,数字が小さいものを優先して取り出せばよい.これは,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])

【参考】【競プロ実況】ABC223 AからD問題【かつっぱ】 - YouTube