이번 문제는 플로이드-와샬 알고리즘을 활용하여 해결하였다. 2차원 리스트 after를 선언하고, 인접 행렬 형태로 [먼저][나중]
에 해당하는 좌표에만 1로 표시를 해주었다. 그리고 플로이드-와샬을 통해 after[i][j]
가 0일 때, after[i][d]
와 after[d][j]
가 1이라면 after[i][j]
를 1로 갱신해주도록 하였다. 그리고 비교하고자 하는 두 사건을 after를 통해 확인하고, 만약 after[앞의 사건][뒤의 사건]
이 1일 경우 앞의 사건이 먼저 일어난 사건이므로 -1을 출력하도록 하였고, 만약 after[뒤의 사건][앞의 사건]
이 1일 경우 1을 출력하도록 하였고, 둘 다 아니라면 0을 출력하도록 하였다.
n, k = map(int, input().split())
after = [[0 for _ in range(n+1)] for _ in range(n+1)]
for _ in range(k):
a, b = map(int, input().split())
after[a][b] = 1
for d in range(1, n+1):
for i in range(1, n+1):
for j in range(1, n+1):
if after[i][j] == 0:
if after[i][d] == 1 and after[d][j] == 1:
after[i][j] = 1
s = int(input())
affair = [list(map(int, input().split())) for _ in range(s)]
for a, b in affair:
if after[a][b]:
print(-1)
elif after[b][a]:
print(1)
else:
print(0)