백준(BOJ) 1647 도시 분할 계획 파이썬(Python)

문제 링크

최소 스패닝 트리 문제이다.
정확히는, 마을들을 두 개의 연결 요소(Connected Component)로 나누어서 각 연결 요소의 최소 스패닝 트리를 구하는 문제이다.
이것은 전체 그래프의 최소 스패닝 트리에서 하나의 간선을 제거하는 것과 동치이다.
최소 스패닝 트리는 이름 그대로 트리이기 때문에, 하나의 간선을 제거하면 두 개의 트리로 분리되기 때문이다.
그리고 그 비용이 각각 최소이므로, 두 연결 요소의 최소 스패닝 트리가 된다.
따라서, 마을 전체의 최소 스패닝 트리를 구한 이후, 그 트리를 구성하는 가장 가중치가 큰 간선을 제거하면 된다.
크루스칼 알고리즘으로 최소 스패닝 트리를 구했다.

from sys import stdin
input = stdin.readline

# 노드의 루트 부모 노드를 구하고 경로를 단축한다
def root(node):
    if parent[node] != node:
        parent[node] = root(parent[node])
    return parent[node]

v, e = map(int, input().split())
edges = []
for _ in range(e):
    edges.append(tuple(map(int, input().split())))

# 크루스칼 알고리즘
edges.sort(key=lambda x: x[2])
ans = temp = 0
parent = [i for i in range(v+1)]
for a, b, c in edges:
    ra = root(a)
    rb = root(b)
    if ra != rb:
        # ans는 스패닝 트리의 가중치 합, temp는 그 중 가장 가중치가 큰 간선
        ans += c
        temp = max(temp, c)
        parent[ra] = parent[rb] = min(ra, rb)

print(ans - temp)

2024

맨 위로 이동 ↑

2023

세그먼트 트리

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

벨만-포드 알고리즘

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

다익스트라 알고리즘

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

맨 위로 이동 ↑