有个博客理解起来很棒,描述的生动形象,插眼:https://blog.csdn.net/chenshibo17/article/details/79933191

用处:给定一张二分图,二分图的每一条边都带有一个权值,求出该二分图的一组最大匹配,使得匹配边的权值总和最大,注意,二分图带权最大匹配的前提是匹配数最大,然后再最大化匹配边的权值总和

局限性:只能满足“带权最大匹配一定是完备匹配”的图中正确求解,完备匹配就是给定一张二分图,其左部、右部节点数相同,均为N个节点。如果该二分图的最大匹配包含N条匹配边,则称该二分图具有完备匹配

时间复杂度:N^4,随机数据N^3

注意:我现在的理解是因为KM的局限性太大,并且时间复杂度也不太优秀,基本上所有可以用KM解决的问题都可以用费用流来解决,所以仅了解一下KM的定义和模板,后续会继续学习网络流

代码:

const int N=310;int n;int la[N],lb[N];//顶标bool visa[N],visb[N];//访问标记int maze[N][N];//边权int match[N];//右部点匹配了哪一个左部点int upd[N];bool dfs(int x)
{visa[x]=true;//访问标记:x在交错树中for(int i=1;i<=n;i++){if(!visb[i]){if(la[x]+lb[i]-maze[x][i]==0)//相等子图{visb[i]=true;//访问标记:y在交错树中if(!match[i]||dfs(match[i])){match[i]=x;return true;}}elseupd[i]=min(upd[i],la[x]+lb[i]-maze[x][i]);}}return false;
} int KM()
{memset(match,0,sizeof(match));for(int i=1;i<=n;i++){la[i]=-inf;lb[i]=0;for(int j=1;j<=n;j++)la[i]=max(la[i],maze[i][j]);}for(int i=1;i<=n;i++){while(1)//直到左部点找到匹配{memset(visa,false,sizeof(visa));memset(visb,false,sizeof(visb));memset(upd,inf,sizeof(upd));if(dfs(i))break;int delta=inf;for(int j=1;j<=n;j++)if(!visb[j])delta=min(delta,upd[j]);for(int j=1;j<=n;j++)//修改顶标{if(visa[j])la[j]-=delta;if(visb[j])lb[j]+=delta;}}}int ans=0;for(int i=1;i<=n;i++)ans+=maze[match[i]][i];return ans;
}

二分图最大权匹配算法KM相关推荐

  1. 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))

    整理的算法模板合集: ACM模板 匈牙利算法又称为 KM 算法,可以在 O(n3)O(n^3)O(n3) 时间内求出二分图的 最大权完美匹配 . 考虑到二分图中两个集合中的点并不总是相同,为了能应用 ...

  2. 二分图最大权匹配 KM算法

    KM算法的正确性基于以下定理: 若由二分图中所有满足A[i]+B[i]=w[i][j]的边C(i,j)构成的子图(即相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配 基本概念 1.完备匹配 ...

  3. HDU - 2255 奔小康赚大钱(二分图最大权匹配+KM)

    题目链接:点击查看 题目大意:中文题目,简单来说就是n个人和n个房子最大匹配,需要一一对应并且满足权值和最大 题目分析:二分图的完备匹配,条件完全符合KM算法的局限性,直接套模板即可,后续学习费用流( ...

  4. KM算法解决二分图最大权分配问题

    匈牙利算法和KM算法都可用来解决任务分配问题(亦称指派问题):假设有n名员工以及n份工作,一个人只能完成一项任务且能完成的任务各不相同.问如何安排员工才能使效率达到最大. 用大白话来描述二分图:二分图 ...

  5. UOJ#80 二分图最大权匹配 [模板题]

    从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,-,nl1,-,nl 和 1,-,nr1,-,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为 ...

  6. 二分图最佳完美匹配——KM算法

    前情概要 学km算法之前,笔者还是希望大家已经掌握了匈牙利算法--也就是对于求解二分图最大匹配的算法.学习本算法的前提除了已经掌握C++语言之外,还需要掌握邻接表存图法,不会的朋友这里有传送门 [微笑 ...

  7. BZOJ 1937: [Shoi2004]Mst 最小生成树 [二分图最大权匹配]

    传送门 题意: 给一张无向图和一棵生成树,改变一些边的权值使生成树为最小生成树,代价为改变权值和的绝对值,求最小代价 线性规划的形式: $Min\quad \sum\limits_{i=1}^{m} ...

  8. 二分图的最大匹配算法

    二分图的概念:二分图是图中的一种特殊模型,如果图的顶点v可以分割成两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B) ...

  9. 二分图最大权匹配问题KM算法讲解 HDU 2255 奔小康赚大钱

    作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...

最新文章

  1. Nagios安装部署与Cacti整合文档超精细版本
  2. Java中的Google协议缓冲区
  3. 【luogu P5022 旅行】 题解
  4. 使用 Packer、Ansible 和 Terraform 构建不可变的基础设施Devops工具链
  5. mysql查询中使用别名_如何在MySQL选择查询中使用别名?
  6. GitHub 标星 11000+,阿里开源的微服务组件如何连续 10 年扛住双十一大促?
  7. 文件浏览器及数码相框 -2.3.2-freetype_arm-1
  8. 与计算机相关的线性代数题,2007级计算机123班线性代数复习题及答案.doc
  9. 项管:配置管理、变更管理、文档管理、知识管理及其他
  10. 并行计算,网格计算与分布式计算的…
  11. docker应用篇(1)如何搭建VXXXN
  12. 鸿蒙造化塔之秘,鸿蒙之始,天地之秘;生生不息,亘古不易;天为之天,地为之地;生为之续,死为之继;玲珑九转,造化之意;的作者、出处以及相似句子__句子大全...
  13. 点评中国互联网CEO语录
  14. Android Studio超级详细安装教程(AMD)
  15. qs计算机专业排名2017,2017qs世界大学学科专业排名top10完整版
  16. python股票网格交易法详解_干货 | 等分网格交易法详解
  17. mysql搜索结果去重_mysql数据库去重查询
  18. 将MP4转换为GIF
  19. python实现情感分析_使用python+机器学习方法进行情感分析(详细步骤)
  20. React实现复制功能

热门文章

  1. MySQL高级 - 内存优化 - MyISAM内存优化
  2. MySQL高级in和not in
  3. Nginx静态资源盗链的效果展示
  4. JdbcTemplate和NamedParameterJdbcTemplate
  5. 装饰者模式的应用场景
  6. 添加tomcat7插件设置jdk编译版本
  7. 局部变量-不同函数内的同名局部变量
  8. 在consumer中调用provider服务
  9. Topic交换器-编写消费者
  10. Exception processing async thread queue