Algorithm

[Algorithm] 34강 : 서로소 집합을 활용한 사이클 판별

반응형

서로소 집합 사이클 판별

1.1 서로소 집합 사이클 판별이란?

  • 서로소 집합은 무방향 그래프 내에서의 사이클을 판별할 때 사용할 수 있다.
    • 참고로 방향 그래프에서 사이클 여부는 DFS를 이용하여 판별할 수 있다.
  • 사이크 판별 알고리즘은 다음과 같다.
    1. 각 간선을 하나씩 확인하며 두 노드의 루트 노드를 확인한다
      1. 루트 노드가 서로 다르다면 두 노드에 대하여 합집합 연산을 수행한다
      2. 루트 노드가 서로 같다면 사이클이 발생한다
    2. 그래프에 포함되어 있는 모든 간선에 대하여 1번 과정을 반복

 

1.2 동작과정

선의 연결 여부를 확인한 후 연결된 상태면 부모 노드를 1로 연결한다. 이때 모든 루트 노드가 같으면 사이클이 발생했다고 한다.

 

1.3 구현

# 특정 원소가 속한 집합을 찾기
def find_parent(parent,x):
	#루트 노드를 찾을 떄까지 재귀 호출
    if parent[x] != x:
    	return find_parent(parent,parent[x])
    retrun 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
        
# 노드의 개수와 간선의 개수 입력받기
v, e = map(int,input().split())
parent = [0] * (v+1) # 부모 테이블 초기화 하기

# 부모 테이블상에서, 부모를 자기 자신으로 초기화
for i in range(1,v+1):
	parent[i] = i

cycle = False # 사이클 발생여부

for i in range(1,v+1):
	a , b = map(int,input().split())
    # 사이클이 발생한 경우 종료
    if find_parent(parent, a) == find_aprent(parent,b):
    	cycle = True
        break
    # 사이클이 발생하지 않았다면 합집합 연산 수행
    else:
    	union_parent(parent, a, b)
 
if cycle:
	print("사이클이 발생했습니다.")
else:
	print("사이클이 발생하지 않았습니다.")

 


이 자료는 동빈 나 님의 이코 테 유튜브 영상을 보고 정리한 자료입니다.

참고 : www.youtube.com/watch?v=m-9pAwq1o3w&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC

반응형