算法 网易笔试(2020-9-12)配对问题
@author:Jingdai
@date:2020.09.14
前几天看到一个网易算法题,不会做,看了博客和书,现在总结一下,方便以后看。
题目描述
相亲活动,男生可以选一个或几个有意向的女生,女生同样;如果互相有意向,则可以初步配对成功,一个男生只能和一个女生配对,问最大的匹配数。
示例:
三个男生1,2,3
三个女生1,2,3
最初6个配对(左男右女):
1-1 1-2 2-1 2-2 3-3 3-2
则最大匹配数就是3。
理论知识
查阅相关资料,这是一个标准的二分图的最大匹配问题,有一个专门的解法匈牙利算法。因为我也是图论小白,所以我以自己通俗的理解来说明几个概念。
二分图
无向图 G=(V,E),若顶点集 V 可以分成两个子集A,B,且A∩B=∅,A∪B=V,且边集 E 中的每一条边的两个顶点都分别属于 A 和 B ,则图 G 称为二分图。如下图就是一个二分图。
匹配
对于二分图,边集 E 的某一个子集 M,如果 M 中的每条边都不相交,则称为二分图的一个匹配。M 中 边的条数称为匹配数,图中红色的边就是一个匹配。
最大匹配
顾名思义,就是一个图中匹配数最大的匹配就是最大匹配。
可增广路
这个比前面的稍微复杂一点点。如果 p 是图 G 中连接两个未匹配点(分别属于子集A和B,如5和3)的路径,且 p 中属于匹配边集 M 和不属于匹配边集(E-M)交替出现,则 p 是一个相对于 M 的可增广路。看下面图的例子理解。
图中红色的边代表匹配,路径(5-1-4-3)就是一条增广路径。
注意,只包含两个未匹配点的路径也是一条增广路径,即图中路径(2-5)也是一个增广路径。
匈牙利算法
懂了怎么找可增广路之后,就可以看这个算法了。先看以下几个性质:
可增广路 p 经过取反后一定可以得到一个更大的匹配 M‘
还是看图解释,
对于可增广路(5-1-4-3),原来属于匹配边集的是(1-4) ,不属于匹配边集的是(5-1)、(4-3);现在取反,得到属于匹配边集的是(5-1)、(4-3),不属于匹配边集的(1-4),匹配数从1变成了2。
(Berge匹配定理)M是图G 的最大匹配,当且仅当G中不存在M的增广路。(对证明有兴趣的童靴可以去看图论)
其实简单的说,匈牙利算法就是不断的找图的可增广路,然后取反增大匹配数,当找不到可增广路时就可以说明找到了最大匹配数。
代码
下面介绍代码。
import java.util.*; public class PairSolution { public static void main(String[] args){ Scanner s = new Scanner