二分图匹配学习记录

导读:重新系统的学习了二分图匹配,感觉面对图论题又有了底气。

(资料来源:http://wenku.baidu.com/link?url=AdT8Ftpj14qoiwS4Ey-DzJCiNVu6VTzWOxsWjcXuNBuCboGXMf67w8QNedjL2ECWCbQDZpu7-uwopB2KGreoNk65hOsEgNj7uyRmeHaP0f7)

几个概念:

1.最大独立集:一个二分图中最大的一个点集,该点集中每个点互不相连。

2.最小顶点覆盖:在二分图中,用最少的点,让所有边都与至少一个点有关联。

3.最小路径覆盖:一个不含圈的有向图G中,G的一个路径覆盖是一个其节点不相交的路径集合P,图中的每一个节点仅包含于一条路径。

二分图常见建图模型:

1.行列匹配法

1 0 1
0 1 0
1 0 0

一个3*3的矩阵,1表示这个地方有敌人,0表示没有敌人。我们可以通过射箭消灭这个位置的敌人。且一根箭可以消灭一行或一列的敌人,问至少需要几根箭。

这题可以运用行列匹配法。我们用敌人坐标的横纵坐标作为点进行匹配。显然,我们只要做一个最小顶点覆盖即可。这里用到二分图的最小顶点覆盖等于其最大匹配。

2.黑白染色法

1 0 1
1 1 1
0 0 1

1代表格子为黑色,0代表各自为白色。每次最多只能修改相邻的两个1。问最少需要修改几次?

这题乍一看也和二分图匹配没啥关系。但我们可以运用染色的方法。将原本一样的点变成二分图。

白1 白5
黑2 白3 黑4
白6

如此一来,我们就可以把白点和黑点之间连上边。然后直接做个二分图匹配,没匹配上的点单独算次数就好啦。

3.反建法(犯贱法?)

一个封建的老师带着学生出去玩,但又怕他们发生早恋。于是打算找出最没可能恋爱的一群男女。如下的同学很难发生恋爱:
身高差>40cm、性别相同、爱好不同的音乐、爱好相同的运动

忍住吐槽这些条件的欲望,让我们分析一下题目。

首先,如果我们按照条件建图的话,恐怕就不是二分图了(边连的不对)。这时候很自然的想到,我们可以把可能发生恋爱的人建边,然后找出最大独立集不就好了吗?

二分图的话,显然最大独立集=总点数-2*最大匹配数。

4.拆点法

之前我们已经提到了最大独立集和最小顶点覆盖,现在我们要提到最小路径覆盖了。复习一下,最小路径覆盖其实就是用最少的路包含所有顶点。这是永远能实现的。

我们可以通过把点集变成一个入点和一个出点来把有向图变成二分图。之后做一个新图的最大匹配,除以二就是原图中我们选择的边。

为什么用匹配的边呢?因为这些边一条可以干掉两个点。还是证一下吧。

证明:设点数为n,二分图最大匹配数为m,未被匹配点数为a

显然,最小路径数为a+m

n=2*m+a ∴最小路径数=n-m

证毕!

时间: 2024-10-17 00:45:27

二分图匹配学习记录的相关文章

学习记录---KMP算法-部分匹配表理解

如需转载,请保留本文链接. 看了 阮一峰 大神的字符串匹配的KMP算法后,关于部分匹配的部分并不是很理解,特意去看了阮大神文章中的英文链接,这里写下自己的理解,用作学习记录. 阮大神文章链接:https://kb.cnblogs.com/page/176818/ Jake Boxer 英文博文链接:http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/ 关于前缀和后缀的定义,这里

二分图匹配-匈牙利算法【学习】

首先二分图匹配的基础概念得清楚:二分图: 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图.匹配: 两两不含公共端点的边集合M称为匹配(简单的说就是右边的点只能连一条边)极大匹配: 指在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数最大匹配: 所有极大匹配当中边数最大的一个匹配增广路: 若P是图G中一条连通两个未匹配顶

POJ2584 T-Shirt Gumbo 二分图匹配(网络流)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int inf=0x3f3f3f3f; 6 const int sink=30; 7 8 struct Edge 9 { 10 int to; 11 int next; 12 int capacity; 13 14 void assign(int t,int n,int c) 15 { 16 to=t; next=n; ca

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr

11082 - Matrix Decompressing (网络流建模|二分图匹配)

该题是一道经典的二分图匹配的题目 .现在终于有点明白什么是二分图匹配了,其实说白了就是依赖于最大流算法之上的一种解决特定问题的算法 . 所谓二分图,就是我们假定有两个集合A和B,每个集合中有若干元素(点),其中源点与A相连,汇点与B相连,并且他们的总容量决定了最终答案的上限,所以一定要维护好 . 然后由A中的点向B中的点连线,他们之间也有一定的容量制约关系(具体看题目中的边权值限制).这样就可以求出最大流量匹配了. 有时我们要求完美匹配,即所有流入的量等于流出的量  . 该题构思极其巧妙,因为我

saltstack学习记录

安装 pip 安装 注意  依赖到zeromq3 minion过一段时间去请求master salt-api  可以访问salt去远程执行 ruby puppet   DSL配置   erb文件  模块  加载  模板支持最差 chef     定义直接是ruby代码   erb模板系统   原生支持 python saltstack   yaml配置文件    python程序模板   模板支持很好 python写模块 ipc 进程间通信 都使用key认证    安全 salt-key  -L

Asp.Net MVC学习记录之“一个实体对象不能由多个 IEntityChangeTracker 实例引用”

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"

Objective-C 学习记录4

字符串的一些方法使用: 1.创建字典的NSString可变字符串,和NSMutableString不可变字符串.都是objective的对象. char *str是字母数组. 2.字符串格式化:stringWithFormat,,格式化任何int,char double,float等的内型. 3.stringWithString字符串赋值和这个类似, NSString *str = @"我就是我!"; 4.字符串转化为UTF-8的格式 stringWithUTF8String 5.两个

NFC学习记录一

随着电子钱包等的类似需求的提出,最近几年NFC(near field communication 近场通信)正在开始慢慢普及.由于工作的需要,现在正在学习NFC相关的知识,先将NFC的一些基础罗列一下,做个记录. 1.NFC简介 NFC(近场通讯)能在短距离内与兼容的设备进行识别和数据交换,一般频率在13.56MHZ,它是RFID与互联互通技术整合而来,如果RFID是父的话,NFC则是子,其继承了父请的功能,又在其上有自己的发挥. NFC一般在这三大领域应用:获取简单信息.点到点通信.电子票务.