匈牙利算法

先来看这么一个问题:一个班级里有n个男生和m个女生,我们有一个n × m的矩阵,grid[i][j] = 1表示第i个男生和第j个女生相互喜欢,问这个班最多能凑出几对情侣

标准的二分图最大匹配问题,只可意会不可言传,具体看代码注释

时间复杂度:O(n^{3})

class Solution:
    def maximumInvitations(self, grid: List[List[int]]) -> int:
        n = len(grid)    # 男生数量
        m = len(grid[0])    # 女生数量
        link = dict()    # 记录女生之前跟哪个男生配对过
        res = 0
        def match(i):
            for j in range(m):    # 枚举所有女生
                if grid[i][j] and j not in used: # 如果男生i与女生j相互喜欢且该女生没有被匹配过
                    used.add(j)    # 记录该女生已经配对
                    # 如果该女生之前没有配对过,或者之前和该女生配对的男生可以换人,就匹配成功
                    if j not in link or match(link[j]): 
                        link[j] = i
                        return True
            return False
        # 遍历男生
        for i in range(n):
            used = set()    # 记录女生是否名花有主
            if match(i):    # 如果匹配成功答案+1
                res += 1
        return res

此问题也可以转化成最大流问题,然后套最大流模板解决

https://blog.csdn.net/nreyong/article/details/123140913

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值