zoukankan      html  css  js  c++  java
  • 二分图匹配

    今上午讲课的时候目睹了大型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.点覆盖集

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

    最小点覆盖集:

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

    证明:

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

  • 相关阅读:
    发一个多维数组转xml格式的php函数方法
    php 返回json和jsonp格式
    phpstudy修改端口及网站根目录和访问 localhost 显示目录文件夹
    web后端开发语言Java和PHP的比较
    VSCode 的PHP常用插件及安装
    Nginx服务器的Websockets配置方法
    WebSocket-demo
    前端资源
    HTTPS 升级指南
    HTTP 协议入门
  • 原文地址:https://www.cnblogs.com/zzz-hhh/p/11202823.html
Copyright © 2011-2022 走看看