网易笔试(2020-9-12)配对问题 匈牙利算法

算法 网易笔试(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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值