二分图匹配

今上午讲课的时候目睹了大型jc现场甚至我也参加了lkpdalao被jc了ahhh

一、概念

什么是二分图?

一张图上的点可以分为、两个点集,点集内的点

没有交集,且任意一条边连接两个点集。

什么是匹配??

匹配:一个匹配即一个包含若干条边的集合,且其中任意两条边没有公共端点。

右图的红边为左图的一个匹配

什么是最大匹配??

在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个_匹配_。

选择这样的边数最大的子集称为_图的最大匹配问题_,最大匹配的边数称为_最大匹配数_.

如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为_完全匹配_,也称作_完备匹配_。

匈牙利算法:

匈牙利算法又称作_稳定婚姻系统_

将左边看做男生,右边看做女生,条件:
1.对于男生来说,右边的女生编号越小心仪度越高
2.对于女生来说,左边的男生编号越大心仪度越高
3.编号小的男生具有优先权
4.在配对最多的前提下,优先满足女生

所以在配对最多的前提下,在满足优先权的前提下
男生选到的是他最差的女生
女生选到的是她最好的男生(这让我想到了封建帝制的男女不平等

上代码(复杂度O(n),n为边数):

应用:

1.最大匹配问题:

例题
因为求的是最小的市区宝石的数量,我们可以转化为最大可以剩下多少宝石的数量,然后可以跑一个二分图
跑二分图的时候注意这是一个环,然后我们可以把这个环的两边都连起来,然后判断这个x的两边的y是不是能把
x搞得没了价值,然后求ans

2.方格图奇偶分治

一个例题,想欣赏英文题目的小伙伴可以戳这里
我翻译下来的简略的中文博客
n*m的方格有些格子已经被占用,每相邻的两个格子可以看成一组, 最多能将方格图划分成多少组,输出方案数..

那么我们可以从最简单的图(都可以利用的那种图)来看

这样一个图怎么进行二分图匹配??

因为他这是相连的两个格子可以涂成黑的,所以他斜着的那个格子就可以不与当前的格子产生影响,那么
这两个方框就可以在同一列中, 因为在同一列里的都是互不相干的,然后连线的时候就可以与这个格子相邻
的上下左右的格子连上点就可以了...(如图,1表示在左列中,2表示在右列中)

3.点覆盖集

点覆盖集是无向图 的一个点集,使得该图中所有边都至少有一个端点在该集合内。
最小点覆盖集是在无向图中,点数最少的点覆盖集。

最小点覆盖集:

最小点覆盖集=二分图最大匹配数

证明:

边分为匹配边和未匹配边;
未匹配边一定至少有一个点被选中,否则会增加一个新的匹配,与最大匹配不符所以是最小点覆盖;
例题
题意:一颗子弹可以清楚一行或一列的障碍,求最少用多少子弹可以清楚所有障碍
因为子弹是一打,打一行或者一列的,那么我们可以将每一行每一列当做一个点,
二分图的时候把列和行分别来放,列放一边,行放一边,然后每个行和列如果有一个障碍的话
那么给他连一个线, 那么二分图就建好了,然后跑一边匈牙利算法就好了...

posted @ 2019-07-17 18:23  _Destiny  阅读(...)  评论(...编辑  收藏