一、问题定义
1.1 相关概念
1.1.1 二分图
给定一个无向图 G = < V , E > G=<V,E> G=<V,E>,其中 V = L ∪ R , L ∩ R = ϕ {V=L\cup R, L\cap R = \phi } V=L∪R,L∩R=ϕ,且每条边 e ∈ E e \in E e∈E,有一个端点在 L L L中而另一个端点在 R R R中,其可记为二分图 G = < L , R , E > G=<L,R,E> G=<L,R,E>
1.1.2 匹配
图 G = < V , E > G=<V,E> G=<V,E>中的一个匹配 M M M是图 G G G边集 E E E的子集( M ⊆ E M\subseteq E M⊆E),其中每个顶点至多关联 M M M的一条边。
1.2 最大二分匹配问题
输入:
\quad 二分图 G = < L , R , E > G=<L,R,E> G=<L,R,E>
输出:
\quad 优化目标: m a x ∣ M ∣ max|M| max∣M∣,匹配 M = { e 1 , e 2 , . . . , e k } {M=\left \{ e_1,e_2,...,e_k \right \} } M={e1,e2,...,ek}
\quad 约束条件: ∀ i , j ( i ≠ q ) , e i = ( l i , r i ) , e j = ( l j , r j ) , 有 l i ≠ l j 且 r i ≠ r j \forall i,j(i\neq q),e_i=(l_i,r_i),e_j=(l_j,r_j),有l_i\neq l_j且r_i\neq r_j ∀i,j(i=q),ei=(li,ri),ej=(lj,rj),有li=lj且ri=rj (每个顶点至多关联一条边)
二、Hungarian匈牙利算法
2.1 交替路径
从未匹配顶点出发,依次经过“非匹配边、匹配边…非匹配边”到达另一侧未匹配顶点形成的路径。
2.2 算法
核心思想:不断寻找交替路径进行增广
Hungarian算法:
\quad ①依次检查左侧顶点:
\quad \quad 情况1:若相邻顶点未匹配,则构成交替路径,直接匹配
\quad \quad 情况2:若相邻顶点已匹配,尝试寻找交替路径,增广成新匹配
\quad ②检测完所有左侧顶点后算法结束
算法的实现:
构造辅助数组matched和color,含义如下:
算法实例:
2.3 伪代码
复杂度分析:
①初始化match数组与color数组: O ( ∣ V ∣ ) O(|V|) O(∣V∣)
②深度优先搜索寻找交替路径: O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(∣V∣+∣E∣)
总复杂度: O ( ∣ V ∣ ∣ E ∣ ) O(|V||E|) O(∣V∣∣E∣)
2.4 正确性证明
思路如下:
将算法正确性证明拆分为以下两个命题即可:
命题1:匈牙利算法得到的匹配 M M M无交替路径
命题2:匹配 M M M无交替路径 ⇔ {\Leftrightarrow } ⇔匹配 M M M是最大匹配