백준(BOJ) 1976 여행 가자 파이썬(Python)

문제 링크

유니온-파인드(Union-Find, Disjoint Set) 응용 문제.
주어진 경로가 하나의 연결 요소(Connected Component)로 이루어졌는지 확인하는 문제다.
하나의 집합이 하나의 연결요소를 의미한다는 것만 파악하면 쉽다.

from sys import stdin
input = stdin.readline

# 파인드
def root(node):
    if node != parent[node]:
        parent[node] = root(parent[node])
    return parent[node]

# 유니온
def union(a, b):
    ra, rb = root(a), root(b)
    parent[ra] = parent[rb] = min(ra, rb)


n = int(input())
m = int(input())
# 그래프가 인접 행렬로 표현되어 있다
graph = [list(map(int, input().split())) for _ in range(n)]
parent = [i for i in range(n+1)]
plan = list(map(int, input().split()))

# 인접 행렬을 읽어와 유니온하는 과정
for i, line in enumerate(graph):
    for j, e in enumerate(line):
        if e:
            union(i+1, j+1)

temp = root(plan[0])
for city in plan:
    # root(temp)가 아니라 temp여도 된다
    if root(city) != root(temp):
        print('NO')
        break
else:
    print('YES')

2024

맨 위로 이동 ↑

2023

세그먼트 트리

개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...

벨만-포드 알고리즘

개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...

다익스트라 알고리즘

개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...

맨 위로 이동 ↑