二分图是一种特殊类型的图,图中的顶点集被划分成X与Y两个子集,图中每条边的两个端点,一定是一个属于X另一个属于Y。二分图的匹配是求边的一个子集,该子集中的任意两条边都没有公共的端点。含边数最多的匹配即为二分图的最大匹配;如果给二分图的边加权,则边权和最大的匹配即为最佳匹配。

  如果可以以某种方式将研究的对象分成两个互补的集合,而需要求得他们之间满足某种条件的“一一对应”关系时,往往可以抽象出对象以及对象之间的关系,构造二分图,然后利用匹配算法来解决。构造二分图模型,设计匹配算法,并对其算法进行适当的优化。

  另外二分图的覆盖数=匹配数,所以求最小覆盖,可以转化为求最大匹配。其证明比较繁琐,组合数学的书上有。

1. 采用网络流的方法计算二分图的最大匹配

  将二分图该做成一个网络:增加一个源点s、一个汇点t,由s到X集合中每点增加一条边,由Y中每点到t增加一条边。

  复杂度分析:找到一条增广路径的时间约为O(n*e),最多n次寻找,时间复杂度为O(e*n^2)

2.计算二分图最大匹配的匈牙利算法

  匈牙利算法是通过构造一颗交错树来计算二分图的最大匹配的。不断的加入增广路径。

  代码:

#define MAXV 200

int N, M; //X和Y顶点数分别为N、M
bool mt[MAXV][MAXV];//二分图, 邻接矩阵

bool used[MAXV]; //Y集合中的点是否使用
int link[MAXV]; //匹配边集,其中顶点y所匹配的边为(link[y], y)

bool check(int x){//判断是否存在由x出发的增广路径
for(int y=1; y<=M; ++y){
if(!used[y] && mt[x][y]){
used[y] = true;
if(link[y] == -1 || check(link[y])){
link[y] = x;
return true;
}
}
}
return false;
}

int max_match(){
int x, y, max;;
for(y=1; y<=M; ++y)
link[y] = -1;
max = 0;
for(x=1; x<=N; ++x){
for(y = 1; y<=M; ++y)
used[y] = false;
if(check(x))
++max;
}
return max;
}

3.计算二分图最佳匹配的KM算法

(还没看懂,看懂了,再往上写)

转载于:https://www.cnblogs.com/liyongmou/archive/2010/07/27/1786334.html

二分图的匹配(未完)相关推荐

  1. 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配

    数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...

  2. poj2112(floyd+二分+二分图多重匹配)

    (感觉是一个比较基础的二分图多重匹配) 题目意思大概就是有K个挤奶点,C个奶牛,一个挤奶点能容下M个奶牛,问如果所有奶牛都被放入挤奶点时,距离最远奶牛得最短距离(距离可以经过其他点) 首先看到可以经过 ...

  3. linux引数列项目过长,Linux 命令个人总结====== 未完待续 个人认为比较重要

    Linux 命令个人总结====== 未完待续 man [功能说明]: 查看帮助 [语法格式]: man [123456789]命令.文件. [选项参数]: 数字"1"表示用户命令 ...

  4. Paper之BigGAN:ICLR 2019最新论文《LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS》(未完待续)

    Paper之BigGAN:ICLR 2019最新论文<LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS> ...

  5. POJ 1486 Sorting Slides(二分图完全匹配必须边)题解

    题意:给你n张照片的范围,n个点的坐标,问你能唯一确定那几个点属于那几张照片,例如样例中4唯一属于A,2唯一属于C,1唯一属于B,3唯一属于C 思路:进行二分图完全匹配,怎么判断唯一属于?匹配完之后删 ...

  6. POJ - 3189 Steady Cow Assignment(二分图多重匹配)

    题目链接:点击查看 题目大意:给出n只奶牛以及m个牛棚,接下来给出一个n*m的矩阵,给出每一只奶牛对于每个牛棚的喜爱度,按照降序给出,从rank1到rankm,现在问如何分配牛棚能让所有奶牛中最高的r ...

  7. 《图解 HTTP》读书笔记(未完待续)

    ARP 协议(Address Resolution Protocol)一种以解析地址的协议,根据通信双方的 IP 地址就可以查出对应的 MAC 地址. MAC( Media Access Contro ...

  8. 深度学习(三十四)对抗自编码网络-未完待续

    占坑,未完待续-- 上面是网络结构.上半部分是一个自编码结构,给定输入数据X,我们经过编码层,可以得到编码层的数据分布q(z|x)的一个采样潜变量编码z.在以前我们的自编码分布q(z|x)是固定的,现 ...

  9. 学完oracle 再学mysql_一篇文章让Oracle程序猿学会MySql【未完待续】

    一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...

  10. HDU 3353 二分图的匹配,最大独立集==最小覆盖点

    题意::从中选出最多的数能够使得其两两之间不能整除 既然是找两两之间不能整除的集合里面的个数,那就是用所有的点减去能够匹配到的整除的匹配数就行,这就是最大独立集 都说这题需要去重但是可以不用去,但需要 ...

最新文章

  1. matlab regstats()
  2. php如何给数组取名,给表单取名可以为数组,并且可以通过php打印出来
  3. 多云战略:企业如何精益求精?
  4. 利用socket转发和反弹端口技术突破防火墙进入内
  5. java 代码转换_java字符编码转换过程(转)
  6. Oracle结构组成
  7. mysql5.7 之 sql_mode=only_full_group_by问题
  8. ubuntu16.04安装FastDFS-5.08
  9. php -- 魔术方法 之 自动加载:__autoload()
  10. MFC树型控件 搜索并展开高亮指定树节点
  11. mac os 使用记录
  12. DateUtil整理
  13. Shawn's 杂记
  14. ubuntu服务器lxde桌面,LXDE桌面环境简介
  15. Vue小写金额转大写金额以及watch(监听)的使用
  16. Json:前台对象数组传到后台解析
  17. Maven基础-Maven的生命周期、命令和插件(6)- mvn test命令详解
  18. DC/DCT/DCG 差别和联系
  19. 基于MFC的五子棋设计与实现
  20. *POJ1830 高斯消元

热门文章

  1. C++Lambda表达式作为参数
  2. For循环执行顺序流程
  3. CSS绝对底部布局 Sticky footer
  4. 基于markdown消息类型实现钉钉报警,让感官更舒服
  5. 博弈论 斯坦福game theory stanford week 2.1_
  6. 用进化的观点学习网络协议
  7. Clouder专项技能认证课程:网站建设——部署与发布
  8. Sixpack —— 支持多语言的 A/B 测试框架
  9. BootStrap--dropdown
  10. 使用wget命令镜像网站