문제의 핵심 유형은 **이분 그래프 네트워크 플로우 + 최소 비용 최대 유량(MCMF)**입니다.
이 글에서는 문제 정보 요약 → 입출력 예제 → 접근 방식 및 로직 설계 → 복잡도 분석 → 구현 코드 → 코너 케이스 순서로 정리합니다.
문제 정보
문제 링크: https://www.acmicpc.net/problem/11409
문제 요약:
직원 \(N\)명과 일 \(M\)개가 있고, 각 직원은 자신이 할 수 있는 일과 그 일을 수행할 때 받아야 하는 월급 목록을 가진다.
각 직원은 최대 한 개의 일만 맡을 수 있고, 각 일 역시 한 명의 직원만 담당할 수 있을 때,
- 할 수 있는 일의 개수를 최대로 만들고,
- 그러한 매칭들 중에서 월급 총합이 최대가 되도록 직원–일 매칭을 구성해야 한다.
제한 조건:
- 시간 제한: 2초
- 메모리 제한: 256MB
- \(1 \le N, M \le 400\)
- 월급: \(0 \le \text{wage} \le 10\,000\)
입출력 예제
입력 1:
| |
출력 1:
| |
설명(요약):
최대 4개의 일을 수행할 수 있으며, 그렇게 매칭했을 때 월급 총합의 최댓값은 23이다.
접근 방식
핵심 관찰
- 직원과 일의 관계는 전형적인 이분 그래프 매칭 구조를 가진다.
- 1순위 목표는 매칭 수(할 수 있는 일의 개수)를 최대로 만드는 것이고,
2순위 목표는 그 상태에서 월급 총합을 최대로 만드는 것이다. - 직원–일 간선의 비용을 \(-\text{월급}\) 으로 둔 뒤, 최소 비용 최대 유량(MCMF) 을 수행하면
- 최대 유량 = 최대 작업 개수
- 최소 비용 = \(-\)최대 월급 합 을 동시에 만족할 수 있다.
알고리즘 설계 (Mermaid Flowchart)
flowchart TD
A[시작: N, M 입력] --> B[그래프 초기화]
B --> C[소스 S, 싱크 T 설정]
C --> D[각 직원 i에 대해
S -> i (cap=1, cost=0) 추가]
D --> E[직원별 가능한 일과 월급 입력]
E --> F[직원 i -> 일 j (cap=1, cost=-wage) 추가]
F --> G[각 일 j에 대해
j -> T (cap=1, cost=0) 추가]
G --> H{S에서 T까지
최소 비용 증가 경로 존재?}
H -- 예 --> I[SPFA로 최단 비용 경로 탐색]
I --> J[경로상의 최소 잔여 용량만큼 유량 흘리기]
J --> K[총 유량, 총 비용 갱신]
K --> H
H -- 아니오 --> L[정답 계산:
maxJobs = flow,
maxWage = -cost]
L --> M[출력 후 종료]
단계별 로직
전처리 및 그래프 구성
- 정점 번호:
- 소스 \(S = 0\)
- 직원: \(1 \sim N\)
- 일: \(N+1 \sim N+M\)
- 싱크 \(T = N + M + 1\)
- 간선 추가:
- \(S \to i\) (직원): 용량 1, 비용 0
- \(i \to N+j\) (직원–일): 용량 1, 비용 = \(-\text{wage}\)
- \(N+j \to T\) (일): 용량 1, 비용 0
- 정점 번호:
메인 로직 (SPFA 기반 MCMF)
- 남은 용량이 있는 간선만 고려하여 SPFA로 \(S \to T\) 최소 비용 경로를 찾는다.
- 경로가 없으면 종료, 있으면 그 경로에 가능한 만큼(최소 잔여 용량) 유량을 흘린다.
- 흘린 유량을
flow에, 해당 경로 비용을cost에 누적한다.
후처리
flow가 곧 할 수 있는 일의 개수이다.cost는 \(-\)월급 총합이므로, \(-\text{cost}\)가 월급 총합의 최댓값이다.flow,-cost를 차례로 출력한다.
복잡도 분석
| 항목 | 복잡도 | 비고 |
|---|---|---|
| 정점 수 | \(V \approx N + M + 2 \le 802\) | 소스/싱크 포함 |
| 간선 수 | \(E \le N \times M + N + M\) | 직원–일 모든 조합 가능한 최악 가정 |
| 시간 복잡도 | \(O(\text{flow} \times V \times E)\) (SPFA 기반 MCMF) | 실제 입력에서는 훨씬 작게 동작 |
| 공간 복잡도 | \(O(V + E)\) | 인접 리스트 및 보조 배열 저장 |
구현 코드
C++
| |
코너 케이스 및 실수 포인트
| 케이스 | 설명 | 처리 방법 |
|---|---|---|
| N=1, M=1 | 최소 규모 그래프 | 반복문 인덱스 범위, 정점 번호 할당을 다시 한 번 점검한다. |
| 어떤 직원도 일을 할 수 없음 | 유량이 0일 수 있음 | 증가 경로가 없을 때 바로 종료하고 flow=0, wage=0을 출력한다. |
| 모든 월급이 0 | 비용 최적화 의미가 약해짐 | 비용이 모두 0이어도 로직이 깨지지 않는지 확인한다. |
| 음수 비용 간선 처리 | 비용을 -월급으로 설정 | SPFA에서 dist 초기화와 갱신 조건을 엄밀히 구현하고, 오버플로를 피하기 위해 INF를 충분히 크게 둔다. |
| 오버플로우 위험 | 월급 합이 커질 수 있음 | 누적 비용은 long long으로 관리한다. |
![Featured image of post [Algorithm] C++ 백준 11409번: 열혈강호 6](/post/algorithm/2025-12-11-boj-11409-yeolhyeol-gangho-6-min-cost-max-flow-cpp-solution/wordcloud_hu_f46976492d9157b3.png)
![[Algorithm] C++ 백준 11409번: 열혈강호 6](/post/algorithm/2025-12-11-boj-11409-yeolhyeol-gangho-6-min-cost-max-flow-cpp-solution/wordcloud_hu_53b0c1906c1fe868.png)
![[Algorithm] C++ 백준 20131번: 트리 만들기](/post/algorithm/2025-12-11-boj-20131-tree-making-cpp-solution/wordcloud_hu_461e53ca4ea7f406.png)
![[Algorithm] C++ 백준 5920번: Cow Photography](/post/algorithm/2025-12-11-boj-5920-cow-photography-cpp-solution/wordcloud_hu_ab327ea8ee254ac3.png)
![[Algorithm] C++ 백준 11868번: 님 게임 2](/post/algorithm/2025-12-08-boj-11868-nim-game-2-game-theory-cpp-solution/wordcloud_hu_cb52f0251e1b8fbb.png)
![[Algorithm] C++ 백준 16741번: 긴급 탈출](/post/algorithm/2025-12-08-boj-16741-emergency-evacuation-cpp-solution/wordcloud_hu_dacf69a3964cf279.png)
![[Algorithm] C++ 백준 11407번: 책 구매하기 3](/post/algorithm/2025-08-14-boj-11407-book-purchasing-3-mincost-maxflow-cpp-solution/wordcloud_hu_ebb13df0bbd37fa9.png)
![[Algorithm] C++ 백준 11408번: 열혈강호 5 - MCMF 최소비용 최대매칭](/post/algorithm/2025-08-14-boj-11408-yeolhyeolgangho-5-cpp-solution/wordcloud_hu_d81364e65a596826.png)
![[Algorithm] C++/Python 백준 3640번: 제독 - 최소 비용 최대 유량](/post/algorithm/2025-08-14-boj-3640-admiral-min-cost-max-flow-cpp-python-solution/wordcloud_hu_eddbd1dcfadbe0c6.png)
![[Algorithm] C++ 백준 11405번: 책 구매하기 - 최소 비용 최대 유량](/post/algorithm/2025-08-14-boj-11405-book-purchasing-min-cost-max-flow-cpp-solution/wordcloud_hu_7a554899c208e19c.png)
![[Algorithm] C++/Python 백준 13161번: 분단의 슬픔 - s-t 최소 컷](/post/algorithm/2025-08-14-boj-13161-division-of-sadness-st-mincut-dinic-cpp-python/wordcloud_hu_cfc38a1484fa3125.png)