BOJ 27909 - Diskurs

image.png

교육적인 문제이다.

BOJ 28032 - Field Day와 동일하게 풀 수 있다.

aia_i에서 가장 많이 비트가 다른 aja_j를 찾는 문제는 bi=ai(2m1)b_i=a_i \oplus (2^m - 1) 라 할 때,

bib_i 들의 거리를 00으로 초기화한다음 최단거리를 구하고

aia_i 의 최단거리를 mm 에서 빼는 문제로 환원된다.


Solution 1 - 최단거리 갱신Permalink

최단거리를 업데이트하는 방법은 비트마스킹이기 때문에 최적화를 해줄 수 있는데,

마치 플로이드 와샬처럼 진행하는 것이다.

i (0i<m)i ~ (0 \le i < m) 번 째 비트를 순회하며 모든 x (0x<2m)x ~ (0 \le x < 2^m) 에 대해

D(x2i)=Min(D(x2i),D(x)+1) D(x \oplus 2^i)=\text{Min}(D(x \oplus 2^i),\,D(x)+1)

을 순회해주는 것으로 시간복잡도 O(2mm)O(2^m \cdot m) 에 구해줄 수 있다.

이 방법이 올바른 결과를 내는 이유는 다음과 같다.

  • D(x)D(x) 에 대해 그것의 실제 값보다 더 줄어들 수 없다.
  • D(x)D(x)에서 D(y)D(y)로의 거리가 kk라면, 알고리즘이 종료되고 D(y)kD(y) \le k이다.

xx를 순회하며 D(x)D(x)를 갱신해주는 것이 아닌 이유는 올바른 순서로 최단경로가 갱신되게하기 위함이다.

Solution 2 - Multi Source BFSPermalink

가장 생각하기 쉬운 방법일 것이고, bib_i 들에 대해서 거리를 00으로 주고 Multi Source BFS를 돌리고 간선은 비트가 하나씩 다른 수들로 가는 것으로 쳐서 최단거리를 찾아주는 것이다.

Tags:

Categories:

Updated:

Comments