티스토리 뷰

📌서로소 집합을 활용한 사이클 판별

서로소 집합은 무방향 그래프 내에서의 사이클 판별할 때 사용

(방향 그래프 내에서의 사이클 판별은 DFS 사용)

 

1. 각 간선을 확인하며 두 노드의 루트 노드를 확인한다.

  - 루트 노드가 서로 다르다면 두 노드에 대하여 union 연산을 수행한다

  - 루트 노드가 서로 같다면 사이클이 발생한 것이다.

2. 그래프에 포함되어 있는 모든 간선에 대해 1번을 반복한다.

 

📌코드

# 특정 원소가 속한 집합 찾기
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


# 노드의 개수와 간선의 개수(union 연산 개수) 입력
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(e):
    a, b = map(int, input().split())
    # 사이클 발생한 경우 종료
    if find_parent(parent, a) == find_parent(parent, b):
        cycle = True
        break
    # 사이클 발생하지 않았다면 union 수행
    else:
        union_parent(parent, a, b)

if cycle:
    print("사이클이 발생했습니다.")
else:
    print("사이클이 발생하지 않았습니다.")

 

 

📌참고

https://g.co/kgs/eyd5SSd

 

이것이 취업을 위한 코딩 테스트다 with 파이썬

IT 취준생이라면 누구나 입사하고 싶은 카카오・삼성전자・네이버・라인!취업의 성공 열쇠는 알고리즘 인터뷰에 있다! IT 취준생이라면 누구나 가고 싶어 하는 카카오, 라인, 삼성전자의 2016년

www.google.com

 

 

'코딩테스트' 카테고리의 다른 글

위상 정렬  (1) 2024.11.12
신장 트리, 크루스칼 알고리즘  (1) 2024.11.11
그래프, 서로소 집합  (1) 2024.11.08
전보  (3) 2024.11.07
미래 도시  (3) 2024.11.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함