【匹配】匈牙利匹配算法

这篇具有很好参考价值的文章主要介绍了【匹配】匈牙利匹配算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

匈牙利匹配算法

1. 正文

1.1 基础概念

二分图

顶点分为两个集合,集合间顶点相连,集合内点不相连

【匹配】匈牙利匹配算法,# 算法合集,算法

匹配

一个匹配就是一个边的集合,其中,任意两条边不存在公共的顶点

最大匹配

上图中,我们能找到多组匹配,在这其中,所含匹配变数最多的的匹配,成为最大匹配。

交替路

从一个未匹配的点出发,依次经过非匹配边,匹配边,非匹配边,这样形成的路称为交替路

增广路

从一个未匹配的点出发,走交替路,如果途径另一个未匹配点(起点不算),则这条交替路称为增广路

1.2 算法流程

1.2.1 通俗理解

概括: 先到先得,能让则让

对于如下已有的匹配,我们需要寻找他的最大匹配。
【匹配】匈牙利匹配算法,# 算法合集,算法

1.2.2 步骤

下面以经典的配对情景进行说明。

现在有boys和girls两个点集,每个人有各自的暧昧对象(可能有多个),现在要把他们配情侣,最多能配多少对?(即,寻找最大匹配数)

说明:

  1. 边表示暧昧关系

注意:

  1. 不能搞基哦
  2. 不能脚踏多只船

【匹配】匈牙利匹配算法,# 算法合集,算法
先从B1看起,他与G2有暧昧,那么先暂时他们配成一对。
注意: 这里突出了先到先得

【匹配】匈牙利匹配算法,# 算法合集,算法
再看B2,B2也可G2纠缠不清,那么我们看G2现在有男友吗?有的,是B1。那B1有没有其他暧昧对象呢?花心男果然是花心男,还有一个G4,同时,G4还没有安排对象。那么把B1和G4配成一对。

注意: 这里突出了能让则让
【匹配】匈牙利匹配算法,# 算法合集,算法
再接着,我们看B3,他这G1直接配对就好。

最后我们看B4,他的暧昧对象是G4,但是G4现在已经有男友了。按照之前的思路,往前到,看看能不能让一让的。发现没法让,所以B4只能单着了。
同时,G3也只能单着。

注意: 这里依然是能让则让,让不了也没法

【匹配】匈牙利匹配算法,# 算法合集,算法
至此,找到一个了最大匹配,但是最大匹配不是固定的。如果从girls这边开始或者从B4开始情况可能就不一样了。但是最大匹配数是一样的。

1.2.3 代码实现

int M,N; // M,N 分表表示左右则集合的元素个数
int Map[MAXM][MAXN]; // 邻接矩阵存图
int p[MAXN]; // 记录当前右侧元素所对应的左侧元素
bool vis[MAXN]; // 记录右侧元素是否已被访问过

bool match(int i){
    for(int j=1;j<=N;++j){ 
        // 有边且未访问
        if(Map[i][j]&&!vis[j]){ 
            vis[j] = true; // 记录访问过
            // 无匹配 或者 原匹配左侧元素可以找到新的匹配
            if(p[j]==0 || match(p[j])){ 
                p[j]=i; // 当前左侧元素成为当前右侧元素的新匹配
                return true // 返回匹配成功
            }
        }
    }
    return false;
}

int Hungarian(){
    int cnt =0;
    for(int i=1; i<=N; ++i){
        memset(vis,false,sizeof(vis)); // 重置vis数组
        if(match(i)) cnt++;
    }
    return cnt
}

1.3 最小点覆盖问题

另外一个关于二分图的问题是求最小点覆盖:我们想找到最少的一些点,使二分图所有的边都至少有一个端点在这些点之中。倒过来说就是,删除包含这些点的边,可以删掉所有边。

【匹配】匈牙利匹配算法,# 算法合集,算法

(König定理):

一个二分图中的最大匹配数等于这个图中的最小点覆盖数。

1.4 应用

1.4.1 案例一

题目:
面对OIBH组织的嚣张气焰, 柯南决定深入牛棚, 一探虚实.
他经过深思熟虑, 决定从OIBH组织大门进入…
OIBH组织的大门有一个很神奇的锁.
锁是由M*N个格子组成, 其中某些格子凸起(灰色的格子). 每一次操作可以把某一行或某一列的格子给按下去.

【匹配】匈牙利匹配算法,# 算法合集,算法

如果柯南能在组织限定的次数内将所有格子都按下去, 那么他就能够进入总部. 但是OIBH组织不是吃素的, 他们的限定次数恰是最少次数.
请您帮助柯南计算出开给定的锁所需的最少次数.

读入/Input:

第一行 两个不超过100的正整数N, M表示矩阵的长和宽
以下N行 每行M个数 非0即1 1为凸起方格

输出/Output:

一个整数 所需最少次数


如果我们把样例的矩阵,转化为二分图的形式,是这样的:

【匹配】匈牙利匹配算法,# 算法合集,算法

按下一行或一列,其实就是删掉与某个点相连的所有边。现在要求最少的操作次数,想想看,这不就是求最小点覆盖数吗?所以直接套匈牙利算法即可。代码略。文章来源地址https://www.toymoban.com/news/detail-860314.html

参考

  1. https://zhuanlan.zhihu.com/p/96229700
  2. https://zhuanlan.zhihu.com/p/62981901

到了这里,关于【匹配】匈牙利匹配算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 目标跟踪:Deepsort--卡尔曼滤波、匈牙利匹配、马氏距离、欧氏距离、级联匹配、reid

    本篇文章供自己学习回顾,其中错误希望指出! 先把目标跟踪中涉及到的名词抛出来: 1、卡尔曼滤波、 2、匈牙利匹配:https://blog.csdn.net/DeepCBW/article/details/124740092 3、马氏距离、 4、欧氏距离、 5、级联匹配、 6、代价矩阵 sort过程比较简单,先搬个图: 基于上图展开对sort的

    2024年02月05日
    浏览(47)
  • 指派问题与匈牙利算法

    有n项不同的工作或任务,需要n个人去完成,要求每人只完成一项工作。由于每人的知识、能力、经验等不同,故各人完成不同任务所需的时间不同。问应指派何人完成何项工作,使完成n项工作总耗时最少。这就是指派问题,指派问题也是整数规划问题。 目标函数是最小化问

    2024年02月05日
    浏览(37)
  • 搜索与图论:匈牙利算法

    将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图 二分图:一定不含有奇数个点数的环;可能包含长度为偶数的环, 不一定是连通图

    2024年02月08日
    浏览(55)
  • 数学建模(四)整数规划—匈牙利算法

    目录 一、0-1型整数规划问题 1.1 案例 1.2 指派问题的标准形式 2.2 非标准形式的指派问题 二、指派问题的匈牙利解法  2.1 匈牙利解法的一般步骤 2.2 匈牙利解法的实例 2.3 代码实现 投资问题: 有600万元投资5个项目,收益如表,求利润最大的方案? 设置决策变量: 模型: 指派

    2024年02月11日
    浏览(39)
  • DETR | 基于匈牙利算法的样本分配策略

    如有错误,恳请指出。 前不久,沐神对DETR进行了讲解,其实之前也对DETR进行了介绍,见:论文阅读笔记 | 目标检测算法——DETR。现对DETR的核心内容进行重温,也就是其所提出的目标检测的end-to-end框架,输入的是一张图像,输出的直接是最后的预测标注结果,不再需要后处

    2024年02月11日
    浏览(37)
  • AcWing 372. 棋盘覆盖(二分图&&匈牙利算法)

    输入样例: 输出样例: 解析:         n为100,状压肯定爆。         将每个骨牌看成二分图的一个匹配,即查找二分图的一个最大匹配,匈牙利算法。

    2024年02月14日
    浏览(35)
  • 图论及其应用(匈牙利算法)---期末胡乱复习版

    T1:从下图中给定的 M = {x1y4,x2y2,x3y1,x4y5},用 Hungariam算法【匈牙利算法】 求出图中的 完美匹配 ,并写出步骤。 关于匈牙利算法: 需要注意的是,匈牙利算法仅适用于 二分图 ,并且能够找到完美匹配。 什么是 交替路 ?从一个未匹配点出发,依次经过非匹配边–匹配边

    2024年02月01日
    浏览(68)
  • AcWing 379. 捉迷藏(最小路径点覆盖&&匈牙利算法)

    输入样例: 输出样例:

    2024年02月14日
    浏览(37)
  • 数学建模笔记——整数规划类问题之我见(匈牙利算法)

    目录 浅浅叙述匈牙利算法 基本思路 计算步骤 来一道简单例题 1.1 符号规定 1.2目标函数​编辑       1.3约束条件 ​编辑 1.4代码 题目复述 基本假设 问题分析 符号说明  模型的建立与求解 模型建立思路 模型建立的过程 建立0-1整数规划模型  运用匈牙利方法: 代码实现  

    2023年04月11日
    浏览(48)
  • 第三章 图论 No.11二分图,匈牙利算法与点覆盖

    257. 关押罪犯 - AcWing题库 最大最小问题,一眼二分 答案的范围在 [ 1 , 1 e 9 ] [1, 1e9] [ 1 , 1 e 9 ] 之间,二分答案,check(mid) check:将所有权值大于mid的边进行二分,若能得到二分图,返回true,否则返回false 最终将得到最优解ans,所有大于ans的边组成的图为二分图,若是图中有边

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包