그래프/역사

Q·2021년 9월 13일
0

알고리즘/백준

목록 보기
66/70

문제 설명


문제

역사, 그 중에서도 한국사에 해박한 세준이는 많은 역사적 사건들의 전후 관계를 잘 알고 있다. 즉, 임진왜란이 병자호란보다 먼저 일어났으며, 무오사화가 기묘사화보다 먼저 일어났다는 등의 지식을 알고 있는 것이다.

세준이가 알고 있는 일부 사건들의 전후 관계들이 주어질 때, 주어진 사건들의 전후 관계도 알 수 있을까? 이를 해결하는 프로그램을 작성해 보도록 하자.

입력

첫째 줄에 첫 줄에 사건의 개수 n(400 이하의 자연수)과 알고 있는 사건의 전후 관계의 개수 k(50,000 이하의 자연수)가 주어진다. 다음 k줄에는 전후 관계를 알고 있는 두 사건의 번호가 주어진다. 이는 앞에 있는 번호의 사건이 뒤에 있는 번호의 사건보다 먼저 일어났음을 의미한다. 물론 사건의 전후 관계가 모순인 경우는 없다. 다음에는 사건의 전후 관계를 알고 싶은 사건 쌍의 수 s(50,000 이하의 자연수)이 주어진다. 다음 s줄에는 각각 서로 다른 두 사건의 번호가 주어진다. 사건의 번호는 1보다 크거나 같고, N보다 작거나 같은 자연수이다.

출력

s줄에 걸쳐 물음에 답한다. 각 줄에 만일 앞에 있는 번호의 사건이 먼저 일어났으면 -1, 뒤에 있는 번호의 사건이 먼저 일어났으면 1, 어떤지 모르면(유추할 수 없으면) 0을 출력한다.


문제링크

전체 코드

import sys

input = sys.stdin.readline

n, k = map(int, input().split())

a = [[0]*n for _ in range(n)]

for _ in range(k):
    x, y = map(int, input().split())
    a[x-1][y-1] = 1

for k in range(n):
    for i in range(n):
        for j in range(n):
            if a[i][k] and a[k][j]:
                a[i][j] = 1

s = int(input())
for _ in range(s):
    x, y = map(int, input().split())

    if a[x-1][y-1] == 1:
        print(-1)
    elif a[y-1][x-1] == 1:
        print(1)
    elif a[x-1][y-1] == 0:
        print(0)

해결 방법

  • 플로이드 와샬 문제
  1. 플로이드-와샬로 모든 경로를 구한다

  2. 앞에 있는 사건이 먼저 일어난 경우가 있는지 우선 체크해본다

  3. 먼저 일어나지 않았다면 다른 케이스를 검증하여 조건에 맞게 값을 출력한다

profile
Data Engineer

0개의 댓글