λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⭐ Problem_Solving/λ°±μ€€

[λ°±μ€€] 14621 λ‚˜λ§Œ μ•ˆλ˜λŠ” μ—°μ•  (Python/파이썬)

by ν¬μŠ€νŠΈμ‰μ΄ν¬ 2022. 10. 2.

<문제 링크>

https://www.acmicpc.net/problem/14621

 

14621번: λ‚˜λ§Œ μ•ˆλ˜λŠ” μ—°μ• 

μž…λ ₯의 첫째 쀄에 ν•™κ΅μ˜ 수 N와 학ꡐλ₯Ό μ—°κ²°ν•˜λŠ” λ„λ‘œμ˜ 개수 M이 주어진닀. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000) λ‘˜μ§Έ 쀄에 각 학ꡐ가 λ‚¨μ΄ˆ λŒ€ν•™κ΅λΌλ©΄ M, μ—¬μ΄ˆ λŒ€ν•™κ΅λΌλ©΄ W이 주어진닀. λ‹€μŒ M개의

www.acmicpc.net

<풀이 μ „λž΅>

1. 기본적인 MST λ¬Έμ œμ΄λ‹€.

2. λŒ€ν•™κ΅ λ‚¨μ΄ˆ/μ—¬μ΄ˆ μ—¬λΆ€λ₯Ό λ”•μ…”λ„ˆλ¦¬ ν˜•νƒœλ‘œ μ €μž₯ν•΄μ„œ 크루슀칼 μ•Œκ³ λ¦¬μ¦˜μ—μ„œ λ‹€μŒ κ°„μ„  선택 μ‹œ λ‹€λ₯Έ μ’…λ₯˜μ˜ λŒ€ν•™κ΅μΌ 경우만 μ„ νƒν•˜λ„λ‘ ν–ˆλ‹€.

3. κ·Έ μ™Έμ—λŠ” 쑰건을 λ§Œμ‘±ν•˜λŠ” mstκ°€ 없을 경우 -1을 좜λ ₯ν•˜λ„λ‘ ν•΄μ•Όλœλ‹€.

 

<μ •λ‹΅ μ½”λ“œ>

import sys, os, io, atexit

input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))

# 220927 14621 λ‚˜λ§Œ μ•ˆλ˜λŠ” μ—°μ• 

# μ •λ‹΅μ½”λ“œ


# μ΅œμ†Œ μ‹ μž₯트리λ₯Ό μœ„ν•œ μœ λ‹ˆμ˜¨νŒŒμΈλ“œ ν•¨μˆ˜
def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
    return parent[x]


def merge(x, y):
    x = find(x)
    y = find(y)

    if x < y:
        parent[y] = x
    else:
        parent[x] = y
    
    return


# N: ν•™κ΅μ˜ 개수, M: λ„λ‘œμ˜ 개수 
N, M = map(int, input().split())
# univ: 각 λŒ€ν•™κ΅μ˜ λ‚¨μ΄ˆ/μ—¬μ΄ˆ μ—¬λΆ€
univ = dict(enumerate(list(input().split()), start=1))

# parent: λΆ€λͺ¨ λ…Έλ“œ λ°°μ—΄
parent = [i for i in range(N + 1)]

# graph: λŒ€ν•™κ΅ κ·Έλž˜ν”„ μ—°κ²° 정보
graph = []
for _ in range(M):
    node1, node2, weight = map(int, input().split())
    graph.append((weight, node1, node2))

graph.sort()

# μ΅œμ†Œ μ‹ μž₯ 트리둜 문제 ν•΄κ²°
def solve():

    # ans: 경둜의 μ΅œμ†Œ 길이, cnt: 경둜둜 μ—°κ²°λœ λŒ€ν•™κ΅ 개수
    ans = 0
    cnt = 0

    for i in range(M):
        distance, node1, node2 = graph[i]
        if  univ[node1] != univ[node2]:
            if find(node1) != find(node2):
                # λŒ€ν•™κ΅ μ—°κ²°
                merge(node1, node2)

                # 경둜 길이 계산 ν›„, λŒ€ν•™κ΅ μ„Έμ£ΌκΈ°
                ans += distance
                cnt += 1

                # λͺ¨λ“  λŒ€ν•™κ΅κ°€ μ—°κ²°λ˜μ—ˆμ„ 경우 μ •λ‹΅ 좜λ ₯ ν›„ λ°˜ν™˜
                if cnt == N - 1:
                    print(ans)
                    return

    # λͺ¨λ“  학ꡐλ₯Ό μ—°κ²°ν•˜λŠ” κ²½μš°κ°€ 없을 경우 -1 좜λ ₯ ν›„ λ°˜ν™˜
    print(-1)
    return

solve()

λŒ“κΈ€