say repository

유니온파인드 알고리즘 본문

알고리즘

유니온파인드 알고리즘

부끄러엇피치 2025. 3. 24. 13:53
728x90

유니온 파인드란?

유니온 파인드는 그래프 알고리즘으로 두 노드가 같은 그래프에 속하는지 판별하는 알고리즘

  • Union 연산 : 노드를 합친다. (루트 노드가 더 작은 노드로)
  • Find 연산 : 노드의 루트노드 찾는다.

Union - Find 과정

1. parent [] 루트 노드를 가리키는 리스트 만들어 각 노드가 자신을 가리키도록 초기화

2. union(1,2) 연산 -> 1과 2의 루트 노드를 찾는다.

합칠 때는 루트 노드가 더 작은 쪽으로 합치며 노드 1이 루트 노드가 더 작기 때문에 

parent 리스트에서 2의 루트 노드를 노드 1의 루트노드 1로 바꿔준다.

# union find 알고리즘

# find 연산 : 루트 노드 찾기
def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
    return parent[x]

# union 연산 : 더 작은 루트 노드로 합치기
def union(x,y):
    x = find(x)
    y = find(y)
    if x<y:
        parent[y] = x
    else:
        parent[x] = y
parent = list(range(9))
union(1,2)
print(parent)
union(2,3)
print(parent)
union(4,5)
print(parent)
union(4,6)
print(parent)
union(6,7)
print(parent)

 

관련 문제

백준 1197번

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

import sys
input = sys.stdin.readline
from queue import PriorityQueue
sys.setrecursionlimit(1000000)
v, e = map(int, input().split())

pq = PriorityQueue() # 우선순위큐
# 루트노드 초기화
parent = [0] * (v+1)
for i in range(v+1):
    parent[i] = i

for i in range(e):
    a,b,c = map(int, input().split())
    pq.put((c,a,b)) # 가중치 우선으로 우선순위 큐에 삽입
# print(pq.queue) # 우선순위 큐 출력

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

def union(x,y):
    x = find(x)
    y = find(y)
    if x<y:
        parent[y] = x
    else:
        parent[x] = y

useEdge = 0
result = 0
while useEdge < v-1:
    w,s,e = pq.get()
    # print(w,s,e)
    # 루트 노드가 같을 때까지 가중치 더하기
    if find(s) != find(e):
        union(s,e)
        useEdge += 1
        result += w
print(result)

'알고리즘' 카테고리의 다른 글

프림 알고리즘  (0) 2025.03.25