DonHurry

[Python] λ°±μ€€ 1197번 - μ΅œμ†Œ μŠ€νŒ¨λ‹ 트리 λ³Έλ¬Έ

Problem Solving

[Python] λ°±μ€€ 1197번 - μ΅œμ†Œ μŠ€νŒ¨λ‹ 트리

_도녁 2022. 11. 10. 22:33

πŸ“– λ¬Έμ œ

 

1197번: μ΅œμ†Œ μŠ€νŒ¨λ‹ 트리

첫째 쀄에 μ •μ μ˜ 개수 V(1 ≤ V ≤ 10,000)와 κ°„μ„ μ˜ 개수 E(1 ≤ E ≤ 100,000)κ°€ μ£Όμ–΄μ§„λ‹€. λ‹€μŒ E개의 μ€„μ—λŠ” 각 간선에 λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ„Έ μ •μˆ˜ A, B, Cκ°€ μ£Όμ–΄μ§„λ‹€. μ΄λŠ” A번 정점과 B번 정점이

www.acmicpc.net

 

πŸ”Ž ν’€μ΄

μœ λ‹ˆμ˜¨ νŒŒμΈλ“œλ₯Ό ν™œμš©ν•˜λŠ” μ΅œμ†Œ μ‹ μž₯ 트리 λ¬Έμ œμž…λ‹ˆλ‹€. λͺ¨λ“  정점듀을 μ—°κ²°ν•˜λ©΄μ„œ, κ°€μ€‘μΉ˜μ˜ 합을 μ΅œμ†Œλ‘œ λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” 사이클을 λ§Œλ“€μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” 크루슀칼 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 잘 μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€. 풀이 방법은 κ°€μ€‘μΉ˜κ°€ κ°€μž₯ μž‘μ€ κ°„μ„ λΆ€ν„° ν•˜λ‚˜μ”© 사이클을 λ§Œλ“€μ§€ μ•ŠμœΌλ©΄μ„œ 각 λ…Έλ“œλ₯Ό μ—°κ²°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ•Œ 사이클을 νŒλ‹¨ν•˜λŠ” 과정은 μœ λ‹ˆμ˜¨νŒŒμΈλ“œλ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.

 

πŸ’» μ½”λ“œ

import sys
input = sys.stdin.readline

V, E = map(int, input().split())
graph = []
root = [int(x) for x in range(V+1)]
for _ in range(E):
    A, B, C = map(int, input().split())
    graph.append((C, A, B))
    graph.append((C, B, A))

# 두 정점 μ‚¬μ΄μ˜ κ²½λ‘œκ°€ 짧은 μˆœμ„œλŒ€λ‘œ μ •λ ¬
graph.sort()

# rootλ₯Ό μ°ΎλŠ” ν•¨μˆ˜
def find_parents(x):
    if root[x] == x:
        return x
    return find_parents(root[x])

# rootλ₯Ό ν†΅ν•©ν•˜λŠ” ν•¨μˆ˜
def union(a, b):
    a = find_parents(a)
    b = find_parents(b)
    if a < b:
        root[b] = a
    else:
        root[a] = b


cost = 0
# 거리 λΉ„μš©, 좜발 λ…Έλ“œ, 도착 λ…Έλ“œ
for k, i, j in graph:
    # 두 λ…Έλ“œμ˜ rootκ°€ κ°™μ§€ μ•Šλ‹€λ©΄ κ±°λ¦¬λΉ„μš© μΆ”κ°€ν•˜κ³  root ν•©μΉ˜κΈ°
    if find_parents(i) != find_parents(j):
        cost += k
        union(i, j)

print(cost)