[ BOJ / Python ] 1613번 역사

황승환·2022년 8월 13일
0

Python

목록 보기
440/498


이번 문제는 플로이드-와샬 알고리즘을 활용하여 해결하였다. 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을 출력하도록 하였다.

Code

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)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글