
* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.
* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.
https://www.acmicpc.net/problem/11724
이 문제를 풀기 위해 유니온파인드를 수행했는데, 처음에 union 연산 이후에 parent 배열 받은거로만 처리하려했는데 통과해 실패했었습니다.
찾아보니까 한번 더 돌아줘야 한다는데 왜 그런지 설명을 해준데가 없어서 질문드립니다.
작성한 코드 및 에러 메세지
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
parent = [i for i in range(N + 1)]
edges = []
def find_parent(parent, n):
if(n != parent[n]):
parent[n] = find_parent(parent, parent[n])
return parent[n]
def union(parent, a, b):
a = find_parent(parent, a);
b = find_parent(parent, b);
if(a < b):
parent[b] = a
else:
parent[a] = b
for _ in range(M):
a, b = map(int,input().split())
edges.append((a, b))
edges = sorted([(min(a, b), max(a, b)) for a, b in edges])
for e in edges:
a, b = e
union(parent,a, b)
# ??? 왜 한번 더 돌아야 하지?
for p in range(len(parent)):
find_parent(parent, p)
print(len(list(set(parent))) - 1)
Tip 1) </> 아이콘을 눌러 코드박스를 만들어 보세요.
Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어요!
