네트워크 플로우 이론의 기본이 되는 이분 매칭 문제를 다루는 대표적인 유형입니다. 직원과 작업을 두 그룹으로 나누어 최대 매칭을 찾는 과정에서 DFS 기반의 효율적인 탐색 전략이 필요합니다.
문제 : https://www.acmicpc.net/problem/11375
문제 설명
N명의 직원과 M개의 작업이 주어집니다. 각 직원은 최대 1개의 작업을 할당받을 수 있으며, 각 작업은 반드시 1명의 담당자가 필요합니다. 주어진 직원-작업 가능 목록에서 최대로 매칭할 수 있는 작업의 개수를 찾는 것이 목표입니다.
입력 형식은 첫 줄에 N과 M이 주어지고, 이후 N줄에 걸쳐 각 직원이 처리 가능한 작업 개수와 번호 목록이 제공됩니다. 출력은 가능한 최대 작업 매칭 수입니다.
핵심 제약 조건은 다음과 같습니다:
- 1 ≤ N, M ≤ 1,000
- 시간 제한 2초 내에 연산 완료
- 효율적인 그래프 탐색 기법 필수
접근 방식
이분 매칭(Bipartite Matching)
두 개의 독립된 그룹(직원-작업) 간 가능한 최대 매칭을 찾는 문제입니다. DFS를 이용한 재귀적 탐색으로 다음과 같은 과정을 수행합니다:
- 그래프 구성: 직원 노드에서 처리 가능한 작업 노드로 방향성 간선 연결
- 매칭 시도: 각 직원 노드에서 DFS 탐색 진행
- 증가 경로 탐색: 이미 매칭된 작업의 담당자가 다른 작업을 처리할 수 있는지 재귀적 확인
- 역추적 갱신: 성공적인 경로 발견 시 매칭 테이블 갱신
시간 복잡도는 O(NE)로 최악의 경우 1,0001,000 = 1,000,000번의 연산이 예상되며, 제한 시간 내에 처리 가능합니다.
C++ 코드와 설명
| |
코드 동작 설명
- 입력 가속화:
ios_base::sync_with_stdio(false)로 입출력 속도 향상 - 인접 리스트 구성: 직원 번호별로 처리 가능 작업 리스트 저장
- DFS 매칭 시도: 각 직원 노드에서 DFS 시작 → 방문 체크 후 가능 작업 탐색
- 매칭 갱신 로직:
match[job]배열을 통해 작업별 매칭 상태 관리 - 결과 집계: 성공적인 매칭 시마다 카운트 증가
결론
이분 매칭 문제의 기본 구조를 이해하는 데 최적의 문제입니다. DFS를 이용한 구현 방식이 직관적이지만, 큰 입력 크기에서의 성능을 위해 방문 배열 관리와 그래프 표현 방식에 주의해야 합니다. 추가적으로 Hopcroft-Karp 알고리즘을 적용하면 O(√N*E) 시간 복잡도로 최적화가 가능하며, 대규모 데이터셋 처리 시 유용합니다.
실제 코딩 테스트 환경에서는 재귀 스택 한도를 고려해야 합니다. 이 문제를 통해 네트워크 플로우 분야의 기본기를 다지는 것이 중요합니다.
![Featured image of post [Algorithm] C++/Python 백준 11375번 : 열혈강호](/bipartite_graph.png)
![[Algorithm] C++/Python 백준 15678번 : 연세워터파크](/post/algorithm/2024-09-19-boj-15678/tmp_wordcloud_hu_a4455fac4cd0f9d7.png)
![[Algorithm] C++/Python 백준 6549번 : 히스토그램에서 가장 큰 직사각형](/post/algorithm/2024-09-14-boj-6549/tmp_wordcloud_hu_a013da41ee6a44ed.png)
![[Algorithm] C++/Python 백준 1605번 : Non-boring sequences](/post/algorithm/2025-01-28-boj-3408/index_hu_2b15d3b1ba5e07d4.png)
![[Algorithm] C++ 백준 1005번 : ACM Craft](/post/algorithm/2024-05-18-boj-1005/tmp_wordcloud_hu_217baf21f3f8489a.png)
![[Algorithm] C++/Python 백준 18251번](/post/algorithm/2025-02-08-boj-18251/index_hu_ade604aa24e31e0c.png)
![[Algorithm] C++/Python 백준 13907번 : 세금](/post/algorithm/2025-02-07-boj-13907/index_hu_1363d4a4a70e7040.png)
![[Algorithm] C++ 백준 12823번 : Critical Projects](/post/algorithm/2025-08-08-boj-12823/wordcloud_hu_e0fba13b8315f6d6.png)
![[Algorithm] cpp 백준 12918번: 정리정돈](/post/algorithm/2025-08-14-boj-12918-cleaning-up-mirror-symmetry-hungarian-cpp-solution/wordcloud_hu_992993152683211.png)
![[Algorithm] cpp 백준 16583번: Boomerangs - DFS 간선 페어링](/post/algorithm/2025-08-14-boj-16583-boomerangs-dfs-edge-pairing-cpp-solution/wordcloud_hu_e4344de8758dbc69.png)