https://www.acmicpc.net/problem/3665
시간 1초, 메모리 256MB
input :
output :
조건 :
해당 문제의 테케가 매우 빈약해서 "?"를 출력하는 경우 자체가 없다.
이거 넣으면 뱃지 받을 수 있을 거 같긴 한데 귀찮으니 넘기고.
꼴등이 진입차수 0을 할지, 1등이 진입차수 0을 할지를 정해야 한다.
1등이 진입 차수 0으로 했기 때문에 graph[높은 등수][낮은 등수]
로 딕셔너리에 저장한다.
?, IMPOSSIBLE 조건
위의 링크에 따라서 조건을 만들었다.
import sys
from collections import deque
t = int(sys.stdin.readline())
for _ in range(t):
n = int(sys.stdin.readline())
prev = list(map(int, sys.stdin.readline().split()))
m = int(sys.stdin.readline())
degree = [0] * (n + 1)
graph = [dict() for _ in range(n + 1)]
for i in range(n - 1, 0, -1):
node = prev[i]
degree[node] = i
for j in range(i - 1, -1, -1):
next_node = prev[j]
graph[next_node][node] = 1
now_degree = [i for i in degree]
for i in range(m):
a, b = map(int, sys.stdin.readline().split())
if degree[a] > degree[b]:
del graph[b][a]
graph[a][b] = 1
now_degree[a] -= 1
now_degree[b] += 1
else:
del graph[a][b]
graph[b][a] = 1
now_degree[b] -= 1
now_degree[a] += 1
q = deque([])
for i in range(1, n + 1):
if now_degree[i] == 0:
q.append(i)
ans = []
while q and len(q) < 2:
node = q.popleft()
ans.append(node)
for next_node in graph[node].keys():
now_degree[next_node] -= 1
if now_degree[next_node] == 0:
q.append(next_node)
if len(q) > 1:
print("?")
elif len(ans) != n:
print("IMPOSSIBLE")
else:
print(*ans)