이분 매칭에서 이미 매칭된 간선을 잠시 취소하고 다른 상대를 찾아도 매칭 수가 늘어나는 이유는 무엇인가요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
증가 경로는 현재 매칭에 속하지 않는 간선과 속하는 간선을 번갈아 지나고, 양 끝이 아직 매칭되지 않은 경로입니다. 이 경로의 모든 간선 소속을 뒤집으면 비매칭 간선이 매칭 간선보다 정확히 하나 많기 때문에 매칭의 크기가 1 증가합니다. 기존 매칭을 잠시 취소하는 것은 손실이 아니라, 이미 점유한 상대를 다른 정점으로 재배치해 자유로운 끝점을 연결하기 위한 과정입니다.
예를 들어 현재 L1-R1만 매칭되어 있고 L2, R2가 자유라고 하겠습니다. 그래프에 L2-R1, L1-R2가 있으면 L2-R1-L1-R2를 따라갈 수 있습니다. 처음에는 L2-R1과 L1-R2가 비매칭이고 가운데 L1-R1만 매칭입니다. 세 간선을 뒤집으면 L2-R1, L1-R2가 매칭되고 L1-R1은 빠져서 1개가 2개가 됩니다. 각 내부 정점은 경로에서 한 번 들어오고 한 번 나가므로 끝점 중복도 생기지 않습니다.
Kuhn DFS가 R1의 기존 상대 L1을 다시 호출하는 이유도 이 구조 때문입니다. L1이 다른 오른쪽 정점 R2를 확보할 수 있으면 R1을 현재 시작 정점 L2에 넘깁니다. 반대로 양 끝이 모두 이미 매칭된 alternating cycle을 뒤집으면 추가된 간선과 제거된 간선 수가 같아 cardinality는 변하지 않습니다. 임의의 DFS 경로를 뒤집는 것이 아니라, 교대성과 양 끝의 자유 상태를 모두 확인해야 합니다.
작은 상태를 배열로 적으면 이유가 더 분명합니다. 처음 matchR=[L1,NONE]에서 L2가 R1을 보며 old=L1을 만납니다. 재귀 호출 try(L1)이 R2의 NONE을 확인해 성공하면, 복귀 시 matchR[R2]=L1, 그 다음 상위 프레임에서 matchR[R1]=L2를 씁니다. 한 번의 성공 복귀가 경로 전체의 뒤집기를 표현하므로, 중간에 매칭 배열을 임의로 지웠다가 실패 시 복구하는 방식보다 불변식을 유지하기 쉽습니다. 다만 그래프에 L1-R2가 없거나 R2도 다른 정점에 막혀 있으면 재귀가 false를 반환하고 원래 배열을 건드리지 않아야 합니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 양 끝이 모두 unmatched이고 간선이 unmatched/matched로 교대한다는 조건을 말한다.
L2-R1-L1-R2의 한 개에서 두 개로 바뀌는 상태를 추적한다.- cycle 뒤집기와 증가 경로 뒤집기를 cardinality 관점에서 구분한다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- 기존 매칭 간선을 취소하면 항상 매칭 수가 늘어난다고 말한다.
- 양 끝이 매칭된 경로 또는 cycle을 augmenting path로 세운다.
- DFS에서 찾은 아무 경로든 뒤집어도 endpoint 중복이 없다고 가정한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- Kuhn DFS가 실패한 한 시작점과 전체 매칭이 최대라는 판정을 어떻게 구분할지 설명해 보세요.
- 성공 복귀 순서로
matchR을 갱신할 때 실패한 재귀 가지가 매칭 배열을 오염시키지 않게 하는 조건은 무엇인가요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.