zoukankan      html  css  js  c++  java
  • 一般图最大匹配

    uoj79

    一般图最大匹配。

    一般图最大匹配与二分图最大匹配相似,但是多了处理奇环的过程。

    最大匹配的思想是:每次寻找一个未被匹配的点,走到另一个未被匹配的点,翻转路径上的所有边。

    可以证明这样子翻转若干次直到没有增广路时,是最优的。

    在二分图这样子一定不会经过重复的点。(画一下图可以知道)

    但是一般图中有奇环,所以可能经过重复的点,算法会死循环。

    所以要处理奇环。

    BFS整张图,把队列中存在过的点染黑,黑点的匹配点染白。

    每次从队列中取出一个点。枚举它的出点,设为v

    若v在当前bfs中未被访问过:则找到了一个匹配,直接返回。

    否则把它的匹配点插入队列。

    若v被访问过,则发现找到了一个环。

    如果这个环是偶环,则不用考虑,一定不会走重复点。

    但是如果这个环是奇环,则要处理。

    设环边为(u,v),lca为h

    把这个环缩起来并且再次寻找增广路。

    证明:如果原图为g,缩点后的图为g'

    则要证明g中的增广路,g'也有

    g'有的增广路,g中也有。

    当g有增广路,发现h->s上的第一条边一定是匹配边。

    如果不是,可以走到一个环上的未盖点继续增广。

    设s->h这个路径为p。

    令gs,g's为g,g'把这条路径取反后的结果。显然匹配大小不变。

    若g存在增广路,则g的最大匹配值应该更大,gs的最大匹配值也应该更大,所以gs也有增广路。

    设gs的增广路为c,则如果c没有经过旧环,则g's也包含c

    否则,让g's的这一条增广路c走到h,则发现肯定有一种走法可以走交错边。

    因为g's的匹配数和g'相同,所以根据增广路定理,g'也有增广路。

    当g'有增广路,如果没走新点,则g中也有。

    如果走了新点,则走新点肯定是走过匹配边,非匹配边。

    匹配边肯定是和h相连的。

    由于环是奇环,且匹配边交错,所以一定可以找到一种走法走到h。

    uoj171

    这道题是一个一般图最大匹配建模,十分巧妙。

    建模的方法是:对于每个篮子拆成3个点,这3个点之间两两连边。

    对于每个点向它能被放置的篮子连边。

    然后求一般图最大匹配,答案再减去n。

    原因是:

    当一个篮子没有连匹配边(没有球被放在这个篮子里),则贡献为1

    当一个篮子连了1条匹配边(有1个球被放在这个篮子里),则贡献为2

    当一个篮子连了2条匹配边(有2个球被放在这个篮子里),则贡献为2

    当一个篮子连了3条匹配边(有3个球被放在这个篮子里),则贡献为3

    减去连的匹配边的个数。(它们的和为球的个数),

    当一个篮子没有连匹配边(没有球被放在这个篮子里),则贡献为1

    当一个篮子连了1条匹配边(有1个球被放在这个篮子里),则贡献为1

    当一个篮子连了2条匹配边(有2个球被放在这个篮子里),则贡献为0

    当一个篮子连了3条匹配边(有3个球被放在这个篮子里),则贡献为0

    恰好为题目所要求的贡献。

    注意,要从大->小增广,这样子在增广的过程中不会让大的点(即球点)失配(观察翻转边的过程可得)。

  • 相关阅读:
    极客教学笔记---Java实现简单聊天客户端模拟
    java单例模式四模板
    关于在命令行进行文件输入输出重定向的小笔记
    Python爬虫入门之爬取图片
    Python爬虫入门之查询ip地址
    Python爬虫入门之get网页信息并作为文本输出
    Checker
    Manacher模板
    POJ3974——Palindrome
    Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/cszmc2004/p/12970371.html
Copyright © 2011-2022 走看看