匈牙利算法学习

匈牙利算法的核心是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。

学习匈牙利算法之前了解的概念,下面M是G的一个匹配。

M-交错路:p是G的一条通路,如果p中的边为属于M中的边与不属于M但属于G的边交替出现,则称p是一条M-交错路。

M-饱和点:对于v∈V(G),如果v与M中的某条边关联,则称v是M-饱和点,否则称v是非M-饱和点。

M-可增广路:p是一条M-交错路,如果p的起点和终点都是非M-饱和点,则称p为M-可增广路。

增广路的定义:

若p是G中一条连通两个未匹配顶点的路径,并且是M-交错路,则称p为相对于M的一条增广路径。

算法轮廓:
⑴置M为空
⑵找出一条增广路径P,通过异或操作获得更大的匹配M’代替M
⑶重复⑵操作直到找不出增广路径为止
 
盗来一张图:
 
伪代码:
bool 寻找从k出发的对应项出的可增广路
{
    while (从邻接表中列举k能关联到顶点j)
    {
        if (j不在增广路上)
        {
            把j加入增广路;
            if (j是未盖点 或者 从j的对应项出发有可增广路)
            {
                修改j的对应项为k;
                则从k的对应项出有可增广路,返回true;
            }
        }
    }
    则从k的对应项出没有可增广路,返回false;
}

void 匈牙利hungary()
{
    for i->1 to n
    {
        if (则从i的对应项出有可增广路)
            匹配数++;
    }
    输出 匹配数;
}

 

posted @ 2013-07-31 15:53  yongren1zu  阅读(203)  评论(0编辑  收藏  举报