개미의 개열시미 프로그래밍

[알고리즘] 백준1197 최소 스패닝 트리 - 파이썬 본문

알고리즘/유니온 파인드, 최소 신장 트리(크루스칼)

[알고리즘] 백준1197 최소 스패닝 트리 - 파이썬

YunHyeok 2021. 9. 13. 21:19
728x90
반응형

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

 

1197번: 최소 스패닝 트리

첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이

www.acmicpc.net

 

 

[풀이 코드]

from sys import stdin

input = stdin.readline

v, e = map(int, input().split())

parent = [i for i in range(v+1)]
array = []
result = 0

def find_parent(parent, x):
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]

def union_parent(parent, a, b):
    a = find_parent(parent, a)
    b = find_parent(parent, b)

    if a < b:
        parent[b] = a
    else:
        parent[a] = b

for _ in range(e):
    a, b, cost = map(int, input().split())
    array.append((cost, a, b))

array.sort()

for edge in array:
    cost, a, b = edge
    if find_parent(parent, a) != find_parent(parent, b):
        union_parent(parent, a, b)
        result += cost

print(result)

 

- 가장 대표적인 최소 신장 트리 알고리즘인 크루스칼 알고리즘을 이코 테에서 배웠던 내용을 코드로 옮기면 되는 문제였다.

 

[최소 신장 트리 개념]



그래프에서 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미합니다.
- 모든 노드가 포함되어 서로 연결되면서 사이클이 존재하지 않는다는 조건은 트리의 조건이기도 합니다.

가장 대표적인 최소 신장 트리 알고리즘 ===> 크루스칼 알고리즘
- 그리디 알고리즘으로 분류됩니다.
- 구체적인 동작 과정은 다음과 같습니다.


1. 간선 데이터를 비용에 따라 오름차순으로 정렬합니다.
2. 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인합니다.
1) 사이클이 발생하지 않는 경우 최소 신장 트리에 포함시킵니다.
2) 사이클이 발생하는 경우 최소 신장 트리에 포함시키지 않습니다.
3. 모든 간선에 대하여 2번의 과정을 반복합니다.

성능 분석
- 크루스칼 알고리즘은 간선의 개수가 E개 일때, O(ElogE)의 시간 복잡도를 가집니다.
- 크루스칼 알고리즘에서 가장 많은 시간을 요구하는 곳은 간선을 정렬을 수행하는 부분입니다.
- 표준 라이브러리를 이용해 E개의 데이터를 정렬하기 위한 시간 복잡도는 O(ElogE)입니다.

728x90
반응형
Comments