609 유니온파인드

source
parent_topic 600-알고리즘 & 코딩테스트
types 이론
tags
##서로소집합 ##서로소집합알고리즘 ##사이클판별 ##무방향그래프 ##그래프알고리즘 ##O_VMlog2V ##find_parent ##union_parent

서로소집합을 찾는, 혹은 그래프끼리 연결되어있지 않는것을 찾는 알고리즘
부모를 먼저자기자신으로 초기화
루트노드를 찾아서 기록한다.
$O(V+Mlog_2V)$

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

# 노드개수만큼 부모테이블 있어야하고 각 부모테이블의 기본값으로 자기자신으로 해야함

무방향그래프에서의 사이클 판별할때 이용가능하다
간선의 각각 노드의 부모노드가 같을때 사이클이 발생한다.
방향이있을때는 dfs로 판별가능하다.

if find_parent(parent, a) = = find_parent(parent, b):
    cycle = True 
    break