문제
교수님은 기다리지 않는다
발상이 중요한 분리 집합 문제입니다.
풀이
무게를 구할 필요 없이, 두 샘플의 무게 차이를 구할 수 있는지만 판단하는 문제를 생각해 봅시다.
분리 집합으로 쉽게 해결할 수 있습니다.
무게를 구할 때에도 분리 집합을 사용합니다.
자신의 부모를 저장하는 parent 배열과 부모보다 얼마나 무거운지를 저장하는 weight 배열을 만듭니다.
쿼리 ! a b w
가 들어오면 weight[a] + w == weight[b]
가 되도록 보정해 달라는 뜻입니다.
우변과 좌변의 차를 구해서 한쪽 트리의 루트에 더하면 됩니다.
코드에서는 좌변에서 우변을 빼고 b에 더했습니다.
단, 보정(union)하기 전에 경로 압축을 해 줘야 합니다. 루트에 대한 상대 무게로 보정값을 구하는 것이기 때문입니다.
코드
1 |
|