• 匈牙利 图解过程


    匈牙利算法--过程图解  

    2007-08-13 01:48:06|  分类: ACM分类 |  标签: |字号 订阅

     
     

    转载:

    以下算法可把G中任一匹配M扩充为最大匹配,此算法是Edmonds1965年提出的,被称为匈牙利算法,其步骤如下:

        1)首先用(*)标记X中所有的非M-顶点,然后交替进行步骤(2),(3)。

        2)选取一个刚标记(用(*)或在步骤(3)中用(yi)标记)过的X中顶点,例如顶点xi,然后用(xi)去标记Y中顶点y,如果xiy为同一非匹配边的两端点,且在本步骤中y尚未被标记过。重复步骤(2),直至对刚标记过的X中顶点全部完成一遍上述过程。

        3)选取一个刚标记(在步骤(2)中用(xi)标记)过的Y中结点,例如yi,用(yi)去标记X中结点x,如果yix为同一匹配边的两端点,且在本步骤中x尚未被标记过。重复步骤(3),直至对刚标记过的Y中结点全部完成一遍上述过程。

    2),(3)交替执行,直到下述情况之一出现为止:

        )标记到一个Y中顶点y,它不是M-顶点。这时从y出发循标记回溯,直到(*)标记的X中顶点x,我们求得一条交替链。设其长度为2k+1,显然其中k条是匹配边,k+1条是非匹配边。

        (Ⅱ)步骤(2)或(3)找不到可标记结点,而又不是情况(Ⅰ)。

        42),(3)步骤中断于情况(Ⅰ),则将交替链中非匹配边改为匹配边,原匹配边改为非匹配边(从而得到一个比原匹配多一条边的新匹配),回到步骤(1),同时消除一切现有标记。

        5)对一切可能,(2)和(3)步骤均中断于情况(Ⅱ),或步骤(1)无可标记结点,算法终止(算法找不到交替链)。

        我们不打算证明算法的正确性,只用一个例子跟踪一下算法的执行,来直观地说明这一点。

    9.3  用匈牙利算法求图9.3的一个最大匹配。

     

        1)置M = Æ,对x1-x6标记(*)。

        2)找到交替链(x1, y1)(由标记(x1),(*)回溯得),置M = {(x1, y1)}

        3)找到交替链(x2, y2)(由标记(x2),(*)回溯得),置M = {(x1, y1), (x2, y2),}

        4)找到交替链(x3, y1, x1, y4)(如图9.4所示。图中虚线表示非匹配边,细实线表示交替链中非匹配边,粗实线表示匹配边),因而得M = {(x2, y2), (x3, y1),(x1, y4)}

        5)找到交替链(x4, y3)(由标记(x4),(*)回溯得),置M = {(x2, y2), (x3, y1),(x1, y4), (x4, y3)}

        6)找到交替链(x5, y4, x1, y1, x3, y7)(如图9.5所示,图中各种线段的意义同上),因而得

                     M = {(x2, y2), (x4, y3),(x5, y4), (x1, y1), (x3, y 7)}

    即为最大匹配(如图9.6所示)。

                                        

    9.6

  • 相关阅读:
    Windows Vista 桌面窗口管理器(1)
    Thinking in Java读书笔记――数组
    php图片上传存储源码,可实现预览
    php at(@)符号的用法简介
    Apache如何添加虚拟目录
    也发个PHP人民币金额数字转中文大写
    PHP Get Current URL
    Zend Studio下的PHP代码调试
    PHP url 加密解密函数
    使用新浪微博php SDK的一点记录
  • 原文地址:https://www.cnblogs.com/Yz81128/p/2643936.html
Copyright © 2020-2023  润新知