문제
- 링크: https://www.acmicpc.net/problem/12766
- 요약: b개의 지사를 s개 하위 프로젝트 그룹으로 나눈다. 같은 그룹의 지사들은 월말에 서로에게 메시지를 보낸다. 각 메시지는
발신 지사 → HQ → 수신 지사로 전달되며 운반원은 동시에 하나의 메시지만 운반할 수 있다. 전체 전달을 끝내기 위한 운반원의 최소 총 이동거리를 구한다. - 제한: \(2 \le n \le 5000\), \(1 \le r \le 50000\), 가중치 비음수, 모든 교차로는 서로 도달 가능. 지사 1..b, HQ는 \(b+1\).
입력/출력
입력: \(n, b, s, r\)과 도로 \(r\)개 \((u, v, \ell)\). 출력: 최소 총 이동거리.
접근 개요
- 핵심 관찰: 한 그룹에서 모든 메시지를 순차적으로 수행하더라도, 다음 작업을 현 위치 지사에서 시작하도록 순서를 잡을 수 있어 추가 이동(재배치) 비용이 들지 않는다. 따라서 그룹의 총 비용은 순수히 각 메시지 경로 길이 합으로 계산된다.
- 정리: 지사 i의 왕복거리 \(w_i = d(i, HQ) + d(HQ, i)\). 크기 \(m\)인 그룹의 전체 비용은 \((m-1) \cdot \sum w_i\). 문제는 \(w\)들을 정렬한 뒤, 이를 s개의 연속 구간으로 분할하여 \(\sum_{grp} (|grp|-1) \cdot \sum_{i\in grp} w_i\)를 최소화하는 문제로 환원된다.
- 구현 계획: HQ 기준 다익스트라 2번(정방향/역방향)으로 \(w_i\) 계산 → 정렬/접두사합 → 분할 DP(모노톤) 최적화.
flowchart TD
A[입력: n,b,s,r 및 도로] --> B[다익스트라: HQ→*]
A --> C[다익스트라: *→HQ (역그래프)]
B --> D[w_i = d(HQ,i)]
C --> E[w_i += d(i,HQ)]
D --> F[정렬 및 prefix]
E --> F
F --> G[DP[k][i] = min_j DP[k-1][j] + (i-j-1)*(S[i]-S[j])]
G --> H[정답: DP[s][b]]
알고리즘
- 거리 전처리: HQ를 기준으로 정방향/역방향 다익스트라로 각각 \(d(HQ, i)\), \(d(i, HQ)\) 계산.
- 가중치 구성: \(w_i = d(HQ,i) + d(i,HQ)\) for i=1..b, 이후 오름차순 정렬.
- 비용식: 구간 \((j+1..i)\)의 비용은 \((i-j-1)\cdot (S[i]-S[j])\) where \(S\)는 \(w\)의 prefix sum.
- DP:
dp[k][i]= 앞의 i개를 k구간으로 나눈 최소 비용. 점화식은 위 비용식을 사용. 모노톤성이 성립하여 분할정복 최적화로 \(O(s\,b\,\log b)\) 내 계산.
복잡도
- 다익스트라 2회: \(O(r \log n)\).
- DP: \(O(s\,b\,\log b)\) (실구현 상 상수 작음). 공간 \(O(b)\) 롤링.
구현 (C++)
| |
코너 케이스 체크리스트
- s = 1 또는 s = b (극단의 분할 수)
- r가 많고 가중치 0이 존재하는 그래프
- 모든 지사가 HQ와 같은 거리 패턴을 가지는 경우(동일 \(w_i\))
- 매우 큰 간선 가중치로 인한 64-bit 오버플로 방지
제출 전 점검
- 다익스트라 초기화/완화 조건 확인, 역그래프 구성 방향 확인
prefix[0]=0및 인덱스 경계 확인- DP 범위:
j ∈ [k-1, i-1],i ∈ [k, b] - 출력 개행/형식,
long long사용
참고자료
- ICPC WF 2016, Problem B 번역판(지사 배정)
![Featured image of post [Algorithm] cpp 백준 12766번: 지사 배정 - D&C DP + 다익스트라](/post/algorithm/2025-08-14-boj-12766-branch-assignment-cpp-solution/wordcloud_hu_9c6f16458d100f85.png)
![[Algorithm] cpp 백준 11933번: 공장들](/post/algorithm/2025-08-14-boj-11933-factories-virtual-tree-lca-cpp-solution/wordcloud_hu_12426b454432f618.png)
![[Algorithm] cpp 백준 1210번: 마피아 - 정점 분할 최소 컷](/post/algorithm/2025-08-14-boj-1210-mafia-cpp-solution/wordcloud_hu_cb60ed568e9c9263.png)
![[Algorithm] cpp 백준 12766번: 지사 배정 - D&C DP + 다익스트라](/post/algorithm/2025-08-14-boj-12766-branch-assignment-cpp-solution/wordcloud_hu_8ed3d226a8579ce2.png)
![[Algorithm] cpp 백준 12858번: Range GCD - 차분+세그트리](/post/algorithm/2025-08-14-boj-12858-range-gcd-cpp-solution/wordcloud_hu_47906873416556e5.png)
![[Algorithm] cpp 백준 12918번: 정리정돈](/post/algorithm/2025-08-14-boj-12918-cleaning-up-mirror-symmetry-hungarian-cpp-solution/wordcloud_hu_992993152683211.png)
![[Algorithm] cpp-python 백준 12735번: Boat](/post/algorithm/2025-08-14-boj-12735-boat-cpp-python-solution/wordcloud_hu_dfad17dd2b1a530d.png)
![[Algorithm] cpp-python 백준 16901번: XOR MST](/post/algorithm/2025-08-14-boj-16901-xor-mst-cpp-python-solution/wordcloud_hu_5a04de18b2ccb6ef.png)
![[Algorithm] cpp 백준 11408번: 열혈강호 5 - MCMF 최소비용 최대매칭](/post/algorithm/2025-08-14-boj-11408-yeolhyeolgangho-5-cpp-solution/wordcloud_hu_d81364e65a596826.png)
![[Algorithm] cpp 백준 17526번: Star Trek](/post/algorithm/2025-08-14-boj-17526-star-trek-li-chao-tree-cpp-solution/wordcloud_hu_e590e9da955beb64.png)