본문 바로가기
코딩테스트 파이썬/백준

최소 스패닝 트리 ( 1197 번 )

by 세용용용용 2025. 5. 14.

1197번: 최소 스패닝 트리

 

🧠 알고리즘

- Kruskal 알고리즘 사용
- 간선을 가중치 기준으로 정렬한 뒤, 사이클이 생기지 않도록 간선을 하나씩 선택
- Union-Find (Disjoint Set) 자료구조 활용

 

🧾 코드

import sys

def _find(idx):
    if pt_list[idx - 1] == idx:
        return idx
    else:
        pt_list[idx - 1] = _find(pt_list[idx - 1])
        return pt_list[idx - 1]


def _union(x, y):
    pt_list[x - 1], pt_list[y - 1] = _find(x), _find(y)

    if pt_list[x - 1] < pt_list[y - 1]:
        pt_list[y - 1] = pt_list[x - 1]
    else:
        pt_list[x - 1] = pt_list[y - 1]
        

def _main(n_list):
    answer = 0
    for a, b, c in n_list:
        if _find(a) != _find(b):
            answer += c
            _union(a, b)

    return answer
            

v, e = map(int, sys.stdin.readline().rstrip().split())
n_list = sorted([tuple(map(int, sys.stdin.readline().rstrip().split())) for _ in range(e)], key=lambda x:x[-1])
pt_list = [i for i in range(1, v + 1)]

print(_main(n_list))

 

⏱️ 시간 복잡도

# 정렬 알고리즘 : 선형 로그 시간 복잡도
sorted([tuple(map(int, sys.stdin.readline().rstrip().split())) for _ in range(e)], key=lambda x:x[-1])

# _main() : 최소 스패닝 트리, 경로 압축 : 선형 시간 복잡도

해당 알고리즘 시간 복잡도 : 선형 로그 시간 복잡도 ( O(n log n) )

 

'코딩테스트 파이썬 > 백준' 카테고리의 다른 글

부분합 ( 1806 번 )  (0) 2025.06.03
도시 분할 계획 ( 1647 번 )  (1) 2025.06.03
용액 ( 2467번 )  (0) 2025.05.01
행렬 제곱 ( 10830번 )  (0) 2025.04.23
치즈 ( 2638 번 )  (0) 2025.04.11