문제
일반(비이분) 그래프에서 간선 가중치 합이 최대 인 매칭을 찾는다. 이분 그래프라면 헝가리안/min-cost-flow로 풀리지만, 일반 그래프에는 홀수 사이클(블로섬) 때문에 그것들이 통하지 않는다. 가중치 블로섬(Edmonds' weighted blossom) 알고리즘이 정답이다.
비가중 블로섬이 "증가 경로 + 블로섬 수축"이었다면, 가중치 버전은 거기에 LP 쌍대(이중 변수) 를 얹는다.
LP와 쌍대
최대 가중치 매칭의 LP 완화는 다음과 같다(변수 \(x_e \ge 0\)):
$$ \max \sum_e w_e x_e \quad\text{s.t.}\quad \sum_{e \ni v} x_e \le 1\ (\forall v),\quad \sum_{e \subseteq B} x_e \le \tfrac{|B|-1}{2}\ (\forall \text{홀수집합 }B). $$
마지막 홀수 집합(blossom) 제약 이 일반 그래프 매칭 다면체의 핵심(Edmonds의 정리)이다. 그 쌍대 변수:
- \(y_v\) : 정점 잠재값(potential).
- \(z_B \ge 0\) : 홀수 집합 \(B\)의 잠재값.
상보 여유(complementary slackness)
최적성의 조건은 모든 간선 \(e = (u, v)\)에 대해
$$ \text{slack}(e) = y_u + y_v + \sum_{B \ni e} z_B - w_e \ge 0, $$
이고, 매칭 간선은 slack이 정확히 0(타이트)이어야 한다. 또 \(z_B > 0\)인 블로섬은 "완전히 매칭"되어 있어야 한다. 알고리즘은 이 조건을 유지하며 잠재값을 조정해 점점 더 큰 타이트 매칭을 만든다.
알고리즘 골격 (primal-dual)
- 잠재값 초기화: \(y_v = \max_e w_e / 2\) 등, 모든 slack \(\ge 0\).
- 노출 정점에서 교대 숲 을 자란다(비가중 블로섬과 동일한 even/odd 라벨).
- slack 0인 간선만 "사용 가능". 사용 가능한 간선이 부족하면 잠재값 조정(dual update):
- even 정점의 \(y\)를 \(\delta\) 줄이고, odd 정점의 \(y\)를 \(\delta\) 늘린다.
- 블로섬 \(z_B\)도 그에 맞춰 조정.
- \(\delta\)는 "다음 사건"(새 타이트 간선, 블로섬 형성/해체)이 일어나는 최소값. - 타이트 간선으로 증가 경로가 생기면 매칭 확장. 블로섬은 수축; \(z_B = 0\)이 되면 확장(expand).
- 더 이상 개선 불가하면 종료 → 최적.
네 가지 \(\delta\) 사건
잠재값 조정 시 다음 중 최소를 \(\delta\)로 잡는다.
| 사건 | 조건 |
|---|---|
| \(\delta_1\) | even 정점 \(y_v \to 0\) (최대 가중치 매칭에서 정점 노출 허용 시) |
| \(\delta_2\) | even–free 간선 타이트 |
| \(\delta_3\) | even–even 간선 타이트 (블로섬/증가 후보) |
| \(\delta_4\) | odd 블로섬의 \(z_B \to 0\) (확장 시점) |
이 사건 구동(event-driven) 방식이 복잡도를 낮춘다.
복잡도
표준 구현은 \(O(V^3)\). 더 정교한 구현(우선순위 큐로 \(\delta\) 관리)은 \(O(VE \log V)\) 또는 \(O(V^3)\) 상수 개선. \(V \le 500\)급에서 안정.
다음 강의에서 구현 구조와 사건 처리 디테일을 본다.