λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/boj

BOJ 1613 - 역사

by HandHand 2021. 6. 9.

문제

λ°±μ€€ 온라인 저지 - 1613번

풀이 κ³Όμ •

μ—­μ‚¬μ˜ ν•œ 지점을 κ·Έλž˜ν”„μ˜ μ •μ μœΌλ‘œ λ‚˜νƒ€λ‚΄λ©΄ 각 μ‚¬κ±΄μ˜ μ „ν›„ κ΄€κ³„λŠ” μ •μ μ˜ 도달성 문제둜 생각할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ μ •μ μ˜ μ΅œλŒ€ κ°œμˆ˜κ°€ 400개 μ΄ν•˜μ΄λ―€λ‘œ O(N^3) 의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§€λŠ” ν”Œλ‘œμ΄λ“œ 와샬 μ•Œκ³ λ¦¬μ¦˜ 을 ν™œμš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.
λͺ¨λ“  μ •μ κ°„μ˜ 도달성 μ—¬λΆ€λ₯Ό 계산해쀀 λ’€, λ¬Έμ œμ—μ„œ μ£Όμ–΄μ§€λŠ” μž…λ ₯의 μ „ν›„ 관계λ₯Ό 좜λ ₯해주도둝 ν–ˆμŠ΅λ‹ˆλ‹€.
λ‹€λ§Œ Python3 의 속도 ν•œκ³„λ‘œ 인해 PyPy둜 μ œμΆœν•΄μ•Ό μ‹œκ°„μ œν•œ 이내에 μˆ˜ν–‰μ΄ κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ


import sys


n, k = list(map(int, sys.stdin.readline().split()))
adj = [[0]*n for _ in range(n)]
for _ in range(k):
    frm, to = list(map(int, sys.stdin.readline().split()))
    adj[frm-1][to-1] = 1
s = int(input())
event = []
for _ in range(s):
    line = list(map(int, sys.stdin.readline().split()))
    event.append(line)


def floyd():
    global adj

    for k in range(n):
        for u in range(n):
            for v in range(n):
                adj[u][v] = adj[u][v] or (adj[u][k] and adj[k][v])


def solution():
    floyd()
    for e in event:
        if adj[e[0]-1][e[1]-1]:
            print(-1)
        elif adj[e[1]-1][e[0]-1]:
            print(1)
        else:
            print(0)


solution()
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€