For Programmer
백준 20955번 파이썬 문제풀이(민서의 응급 수술) - (유니온 파인드) 본문
728x90
https://www.acmicpc.net/problem/20955
20955번: 민서의 응급 수술
민서는 강원대학교 컴퓨터공학과의 신임 교수이다. 그녀가 저술한 효율적인 택배 배달을 위한 최적 경로 설계에 관한 연구 논문은 아직도 널리 인용되고 있다. 오늘도 열심히 강의를 하던 민서
www.acmicpc.net
간단한 유니온 파인드 문제이다.
풀이 방식은 유니온 파인드 돌린 후
1. 만약 두 노드가 이미 연결되어 있다면 연산횟수 + 1
2. 모든 연산이 끝난 후 연결되지 않은 연결요소 집합이 몇개 존재하는지 set함수를 통해 체킹
import sys
input = sys.stdin.readline
def find(x):
if x != parent[x]:
parent[x] = find(parent[x])
return parent[x]
def union_(a, b):
a = find(a)
b = find(b)
if a == b:
return
if rank[a] > rank[b]:
parent[b] = a
elif rank[a] < rank[b]:
parent[a] = b
else:
parent[a] = b
rank[b] += 1
N, M = map(int, input().split()) # 뉴런의 개수와 시냅스의 개수
parent = [i for i in range(N + 1)]
rank = [0] * (N + 1)
set_count = set()
cnt = 0
for _ in range(M):
a, b = map(int, input().split())
# 만약 두 노드가 싸이클이 형성되어 있다면 연산 횟수 1 증가
if find(a) == find(b):
cnt += 1
else: # 싸이클이 형성되어 있지 않다면 유니온 처리
union_(a, b)
# 현재 연결되지 않은 연결요소 집합이 몇개 존재하는지 set함수를 통해 확인
for i in range(1, N + 1):
set_count.add(find(i))
# 싸이클이 형성된 횟수 + 연결요소에 존재하는 집합의 개수 - 1을 출력
print(cnt + len(set_count) - 1)
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 2887번 파이썬 문제풀이(행성 터널) - (크루스칼) (0) | 2022.04.28 |
---|---|
백준 1647번 파이썬 문제풀이(도시 분할 계획) - (크루스칼) (0) | 2022.04.27 |
백준 20040번 파이썬 문제풀이(사이클 게임) - (유니온 파인드) (0) | 2022.04.26 |
백준 1939번 파이썬 문제풀이(중량 제한) - (1. 최대힙 다익스트라, 2. 유니온 파인드) (0) | 2022.04.25 |
백준 18352번 파이썬 문제풀이(특정 거리의 도시 찾기) (0) | 2022.04.21 |