π©π»βπ»λ¬Έμ μ€λͺ
[μ΄μ½ν
Ch18-45] μ΅μ’
μμ (κ·Έλν)
βοΈIdea Sketch
λ¬Έμ μμ½
νμ 1λ²λΆν° nλ²κΉμ§ λ²νΈκ° λ§€κ²¨μ Έ μλ€.
μλ
μλ μ΅μ’
μμλ₯Ό λ°ννλ€.
νμ§λ§ μ¬ν΄μλ μλ
κ³Ό λΉκ΅νμ¬ μλμ μΈ μμκ° λ°λ νμ λͺ©λ‘λ§ λ°ννλ€.
μ¬ν΄ λͺ©λ‘μ λ°νμΌλ‘ μ¬ν΄ μ΅μ’ μμλ₯Ό λ§λ€μ΄ μΆλ ₯ν΄λ³΄μ.
"?"λ₯Ό μΆλ ₯ : νμ€ν μμλ₯Ό μ°Ύμ μ μλ κ²½μ°
"IMPOSSIBLE"μ μΆλ ₯ : λ°μ΄ν°μ μΌκ΄μ±μ΄ μμ΄μ μμλ₯Ό μ ν μ μλ κ²½μ°
μκ³ λ¦¬μ¦ : μμ μ λ ¬
μμ μ λ ¬μ μ¬μ΄ν΄μ΄ μλ λ°©ν₯ κ·Έλνμ λͺ¨λ λ Έλλ₯Ό λ°©ν₯μ±μ κ±°μ€λ₯΄μ§ μλλ‘ μμλλ‘ λμ΄νλ κ²μ μλ―Ένλ€.
μλ μ μ΅μ’ μμλ λ°©ν₯μ±μ κ°μ§κ³ μλ€. μ΄λ₯Ό μΈμ 리μ€νΈλ‘ ννν ν, μ¬ν΄μ λͺ©λ‘μ λ°λΌ μΌλΆ κ°μ μ λ°©ν₯μ λ°κΎΌλ€. μΈμ 리μ€νΈλ₯Ό λ€μ λ°©ν₯μ±μ κ±°μ€λ₯΄μ§ μλλ‘ μμλλ‘ λμ΄νλ©΄ λλ€.
μκ°λ³΅μ‘λ
O(V + E)
μμ μ λ ¬μμλ μ°¨λ‘λλ‘ λͺ¨λ λ Έλλ₯Ό νμΈνλ©° κ° λ Έλμμ λκ°λ κ°μ μ μ°¨λ‘λλ‘ μ κ±°νλ€. λͺ¨λ λ Έλμ λͺ¨λ κ°μ μ νμΈνλ―λ‘ μμ μ λ ¬ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ O(V + E) μ΄λ€.
βοΈλ΄ μμ€μ½λ
μλ μ μ΅μ’ μμλ₯Ό μΈμ 리μ€νΈλ‘ ꡬννλ€.
1 -> []
2 -> [1]
3 -> [2, 1]
4 -> [3, 2, 1]
5 -> [4, 3, 2, 1]μ¬ν΄ λͺ©λ‘μ λ°νμΌλ‘ κ°μ μ λ°©ν₯κ³Ό μ§μ μ°¨μλ₯Ό μμ νλ€.
μμ μ λ ¬μ ꡬννλ€.
cycleμ΄ μκΈ΄ κ²½μ°, λ°μ΄ν°μ μΌκ΄μ±μ΄ μλ κ²μ΄λ―λ‘ "IMPOSSIBLE"μ μΆλ ₯νλ€. μ¬ν΄ λͺ©λ‘μ (1, 2), (2, 3)μ΄ μμ΄ μμκ° λ€μ§ν κ²½μ° μλμ κ°μ΄ μ¬μ΄ν΄μ΄ μκΈ΄λ€.
1 -> [2]
2 -> [3]
3 -> [1]νμ€ν μμλ₯Ό μ°Ύμ μ μλ€λ λ§μ 곡λ μμκ° μλ€λ λ»μ΄λ€. νμ§λ§ μ¬ν΄ λͺ©λ‘μ μλμ μμκ° λ€μ§ν λͺ©λ‘μΌ λΏμ΄λ€. 곡λ 2μ, 곡λ 3μμ κ°μ μ 보λ ν¬ν¨νμ§ μλλ€. λ°λΌμ μλ μ΅μ’ μμμ 곡λ μμκ° μμ΄μΌ μ¬ν΄μλ νμ€ν μμλ₯Ό μ°Ύμ μ μλ€. μ μ΄μ μλ μ΅μ’ μμμλ 곡λ μμλ κ³ λ €νμ§ μμΌλ―λ‘, "?"λ₯Ό μΆλ ₯νλ ν μ€νΈ μΌμ΄μ€λ μλ€.
μ 체 μ½λ
from collections import deque
import sys
si = sys.stdin.readline
t = int(si())
for _ in range(t):
n = int(si())
team = list(map(int, si().rstrip().split()))
graph = [[] for _ in range(n + 1)]
degree = [0 for _ in range(n + 1)]
for i in range(n - 1):
for j in range(i + 1, n):
graph[team[i]].append(team[j])
degree[team[j]] += 1
# μ¬ν΄ λͺ©λ‘
m = int(si())
for _ in range(m):
a, b = map(int, si().rstrip().split())
flag = True
for x in graph[a]:
if x == b:
graph[a].remove(b)
graph[b].append(a)
degree[b] -= 1
degree[a] += 1
flag = False
if flag: # aκ° graph[b]μ μμ
graph[b].remove(a)
graph[a].append(b)
degree[a] -= 1
degree[b] += 1
# μμ μ λ ¬
queue = deque()
answer = []
for i in range(1, n + 1):
if degree[i] == 0:
queue.append(i)
while queue:
x = queue.popleft()
answer.append(x)
for y in graph[x]:
degree[y] -= 1
if degree[y] == 0:
queue.append(y)
if len(answer) < n:
print("IMPOSSIBLE")
else:
print(*answer)