import sys
input = sys.stdin.readline
n, k = map(int, input().split())
accident = ((0) * n for _ in range(n))
for _ in range(k):
a, b = map(int, input().split())
# 늦게 일어난 사건을 1로 표시
accident(a-1)(b-1) = 1
# i -> k 가 늦게 일어났고, k -> j도 늦게 일어났다면
# i -> j도 후순위인 것
for k in range(n):
for i in range(n):
for j in range(n):
if accident(i)(k) == 1 and accident(k)(j) == 1:
accident(i)(j) = 1
if i == j:
accident(i)(j) = 0
# 일어난 일 유추하기
s = int(input())
for _ in range(s):
a, b = map(int, input().split())
a -= 1; b -= 1
if accident(a)(b):
print("-1")
elif accident(b)(a):
print("1")
else:
print("0")
해결하는 과정
유체 – 워샬
1. 늦은 이벤트를 1로 표시
2. (i)(k)가 1이고 (k)(j)가 1이면 (i)(j)도 1입니다.
3. (a)(b)가 1이면 b는 종속입니다.
반대로 (b)(a)가 1이면 a는 다음에 종속됩니다.
1613호: 역사
첫 번째 줄은 이벤트 번호 n(400 미만의 자연수)과 알려진 이벤트의 컨텍스트 번호 k(50000 미만의 자연수)를 제공합니다.
다음 k 줄은 컨텍스트를 알고 있는 두 이벤트의 번호를 제공합니다.
www.acmicpc.net