반응형
서로소 집합 사이클 판별
1.1 서로소 집합 사이클 판별이란?
- 서로소 집합은 무방향 그래프 내에서의 사이클을 판별할 때 사용할 수 있다.
- 참고로 방향 그래프에서 사이클 여부는 DFS를 이용하여 판별할 수 있다.
- 사이크 판별 알고리즘은 다음과 같다.
- 각 간선을 하나씩 확인하며 두 노드의 루트 노드를 확인한다
- 루트 노드가 서로 다르다면 두 노드에 대하여 합집합 연산을 수행한다
- 루트 노드가 서로 같다면 사이클이 발생한다
- 그래프에 포함되어 있는 모든 간선에 대하여 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
반응형
'Algorithm' 카테고리의 다른 글
[Algorithm] 36강 : 위상정렬 알고리즘의 정의와 구현 (0) | 2020.11.26 |
---|---|
[Algorithm] 35강 : 크루스칼 알고리즘의 정의와 구현 (0) | 2020.11.26 |
[Algorithm] 33강 : 서로소 집합 자료구조의 정의와 구현 (0) | 2020.11.23 |
[Algorithm] 32강 : 최단 경로 알고리즘 기초 문제 풀이 (0) | 2020.11.20 |
[Algorithm] 31강 : 플로이드 워셜 알고리즘의 정의와 구현 (0) | 2020.11.19 |