chldkato

백준 1613 역사 (파이썬) 본문

백준

백준 1613 역사 (파이썬)

chldkato 2020. 2. 17. 01:59

https://www.acmicpc.net/problem/1613

 

1613번: 역사

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

www.acmicpc.net

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

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

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

import sys

input = sys.stdin.readline

n, m = map(int, input().split())
a = [[0]*n for _ in range(n)]

for _ in range(m):
    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)

Comments