https://www.acmicpc.net/problem/20955
풀이 과정
- 입력된 뉴런 a와 b가 같은 집합 내에 속해있는지 검사한다.
- 같은 집합 내에 속해있지 않다면 Union
- 같은 집합 내에 속해있다면 해당 뉴런은 끊어내야 하는 뉴런이므로 연산 횟수를 하나 증가시킨다.
- 모든 뉴런들에 대해 같은 집합에 속해있는지 검사한다.
- 다른 집합에 속해있다면, 두 집합을 Union 해주고 연산 횟수를 하나 증가시킨다.
- 연산 횟수를 출력시켜준다.
소스 코드
import sys
sys.setrecursionlimit(10**6)
input = lambda: sys.stdin.readline().rstrip()
N, M = map(int, input().split())
parent = [i for i in range(N+1)]
def find(parent, a):
if parent[a] != a:
parent[a] = find(parent, parent[a])
return parent[a]
def union(parent, a, b):
p1 = find(parent, a)
p2 = find(parent, b)
if p1 != p2:
parent[p1] = p2
answer = 0
for _ in range(M):
a, b = map(int, input().split())
if find(parent, a) != find(parent, b):
union(parent, a, b)
else:
answer += 1
parent_node = find(parent, 1)
idx = 1
for i in range(2, N+1):
if find(parent, i) != parent_node:
union(parent, i, idx)
parent_node = find(parent, i)
idx = i
answer += 1
print(answer)
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 1766 ] [ 위상 정렬 ] 문제집 (0) | 2021.12.27 |
---|---|
[ 2533 ] [ Tree + DP ] 사회망 서비스(SNS) (0) | 2021.12.24 |
[ 22856 ] [ Tree ] 트리 순회 (0) | 2021.12.20 |
[ 2602 ] [ DP ] 돌다리 건너기 (0) | 2021.12.16 |
[ 2482 ] [ DP ] 색상환 (0) | 2021.12.15 |