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

BOJ 2458 - ν‚€ μˆœμ„œ

by HandHand 2021. 3. 8.

문제

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

풀이 κ³Όμ •

ν•™μƒλ“€μ˜ ν‚€ 차이 관계가 μ£Όμ–΄μ§ˆ λ•Œ μžμ‹ μ˜ ν‚€ μˆœμ„œλ₯Ό νŒŒμ•…ν•  수 μžˆλŠ” ν•™μƒμ˜ 수λ₯Ό μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

ν‚€ μˆœμ„œλ₯Ό νŒŒμ•…ν•˜κΈ° μœ„ν•΄μ„œλŠ” μžμ‹ μ„ μ œμ™Έν•œ λͺ¨λ“  ν•™μƒλ“€κ³Όμ˜ λŒ€μ†Œ 관계λ₯Ό νŒŒμ•…ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
λ•Œλ¬Έμ— N λͺ…μ˜ 학생듀을 κ·Έλž˜ν”„μ˜ 정점, 학생듀 μ‚¬μ΄μ˜ ν‚€ 정보λ₯Ό 간선이라고 ν•˜λ©΄
ν•œ 학생이 λ‹€λ₯Έ λͺ¨λ“  학생에 도달 κ°€λŠ₯ν•˜κ±°λ‚˜ λ‹€λ₯Έ ν•™μƒμœΌλ‘œλΆ€ν„° ν•΄λ‹Ή ν•™μƒμœΌλ‘œ 도달 κ°€λŠ₯ν•œ 총 인원이 N - 1 이어야 ν•©λ‹ˆλ‹€.
ν”Œλ‘œμ΄λ“œ 와샬 μ•Œκ³ λ¦¬μ¦˜μ„ ν™œμš©ν•΄μ„œ λͺ¨λ“  학생듀 μ‚¬μ΄μ˜ 도달 κ°€λŠ₯성을 νŒŒμ•…ν•˜λ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ


import sys

N, M = list(map(int, sys.stdin.readline().split()))
edges = [list(map(int, sys.stdin.readline().split())) for _ in range(M)]


def make_graph():
    dist = [[0] * N for _ in range(N)]

    for frm, to in edges:
        dist[frm - 1][to - 1] = 1

    return dist


def floyd(dist):
    for k in range(N):
        for u in range(N):
            for v in range(N):
                dist[u][v] = dist[u][v] or (dist[u][k] and dist[k][v])


def solution():
    dist = make_graph()
    floyd(dist)
    answer = 0

    for frm in range(N):
        acc = 0

        for to in range(N):
            if dist[frm][to] or dist[to][frm]:
                acc += 1

        if acc == N - 1:
            answer += 1

    return answer


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

'πŸƒ algorithm > boj' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

BOJ 17829 - 222-풀링  (0) 2021.03.08
BOJ 13905 - μ„ΈλΆ€  (0) 2021.03.08
BOJ 18111 - λ§ˆμΈν¬λž˜ν”„νŠΈ  (0) 2021.03.08
BOJ 1806 - λΆ€λΆ„ν•©  (0) 2021.03.08
BOJ 6186 - Best Grass  (0) 2021.03.08

πŸ’¬ λŒ“κΈ€