zoukankan      html  css  js  c++  java
  • 二分图匹配学习记录

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

    (资料来源: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

    证毕!

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    堆栈学习
    需要阅读的书籍
    Rust Book Lang Ch.19 Fully Qualified Syntax, Supertraits, Newtype Pattern, type aliases, never type, dynamic sized type
    Rust Lang Book Ch.19 Placeholder type, Default generic type parameter, operator overloading
    Rust Lang Book Ch.19 Unsafe
    Rust Lang Book Ch.18 Patterns and Matching
    Rust Lang Book Ch.17 OOP
    Rust Lang Book Ch.16 Concurrency
    Rust Lang Book Ch.15 Smart Pointers
    HDU3966-Aragorn's Story-树链剖分-点权
  • 原文地址:https://www.cnblogs.com/Shymuel/p/4492353.html
Copyright © 2011-2022 走看看