문제 링크
- http://icpc.me/16901
사용 알고리즘
- 분할 정복
시간복잡도
- $O(N \log N \log 2^{30})$
풀이
가중치를 30비트로 표현할 수 있고 XOR로 표현되는 가중치를 최소화시키는 것이 목적이므로, Binary Trie를 만든 뒤 30번째 비트부터 쭉 봅시다.
30번째 비트가 켜져있는 정점들의 집합과 꺼져있는 정점들의 집합을 잇는 간선은 한 개 있는 것이 최적입니다. 켜져있는 집합의 원소들로 Binary Trie를 구성한 뒤, 꺼져있는 원소들과 XOR했을 때 최소가 되는 값을 Trie로 찾아줄 수 있습니다. 가중치가 최소인 간선을 하나 찾아서 MST에 추가해줍시다.
각 집합에 있는 원소들을 29번째 비트 기준으로 보고 분할하고, 28번째 비트 기준으로 보고 분할하고… 반복해주면 문제를 풀 수 있습니다.
전체 코드
1 |
|