匈牙利算法

 

 

     匈牙利算法基本理念:首先读入出发集X里某顶点A,然后进入循环(遍历被匹配集Y里的顶点),如果找到了一个顶点B满足:1、可以与点A相连;2、并且在这场循环里,还没被配对或重新配对过;如果都满足就进入下层判断:1、如果此点B从来还没被匹配过(即还没加入过这个匹配圈);2、如果此点B被匹配了,但是跟它匹配的点还可以找到其他的点。如果这两个条件符合一个,就可以将点B就会被匹配给点A。

 

匈牙利算法

过程分析:

匈牙利算法

第一个最外层的循环从x1开始:

  按照流程图,第一次肯定有xi了,清空标记后,yi肯定也是没有标记的了。然后对yi进行标记,第一次M自然也是空的了,M中加入(x1,y1)得到新的M{(x1,y1)},于是得到下图。

匈牙利算法

最外层循环到了x2:

  好,接下来最大匹配数加1,循环继续。下面就该轮到x2了。首先清空Y的标记。

匈牙利算法

这时x2再找到y1时它已经没有标记了,这时再来标记它。但y1已经在M中了,它的对应顶点为x1。所以接下来x1要更新关联点。

匈牙利算法

由x1开始查找时,在Y中y1已经被标记了,只能找下一个顶点,于是便找到了y2。y2未被标记,标记它。x1的关联点更新为y2,x2的关联点更新为y1。因此得新的M为{(x2,y1),(x1,y2)}

匈牙利算法匈牙利算法

好,最大匹配数加1,循环继续。清空Y中标记。

最外层循环到了x3:

匈牙利算法

下面就轮到x3了。x3找到y1,y1未标记,标记之。

匈牙利算法

y1的关联是x2。又轮到x2找了。x2找到y1,但y1已被标记,于是便找到y2。y2未被标记,标记之。

匈牙利算法

y2的关联为x1,x1开始找。x1找到y1,y1已被标记,找到y2,y2已被标记。找到y3,y3未被标记,标记之。同时y3没有关联。更改x1的关联为y3。

匈牙利算法匈牙利算法

  原(x1,y2)的关联也因为x1的改变,变为了(x2,y2)

匈牙利算法匈牙利算法

同时新增关联(x3,y1)更新M为{(x3,y1),(x2,y2),(x1,y3)}。最大匹配数加1。这时已经没有更多的X中顶点可选了。最大匹配数就这样被找出来了。

匈牙利算法

有M'{(x2,y1),(x1,y2)},最后找出的路径x3->y1->x2->y2->x1->y3是一条增广路径。

匈牙利算法

 下面说一些增广路的特性。

  (1)有奇数条边。
  (2)起点在二分图的左半边,终点在右半边。
  (3)路径上的点一定是一个在左半边,一个在右半边,交替出现。
  (4)整条路径上没有重复的点。
  (5)路径上的所有第奇数条边都不在原匹配中,所有第偶数条边都出现在原匹配中。
  (6)把增广路径上的所有第奇数条边加入到原匹配中去,并把增广路径中的所有第偶数条边从原匹配中删除(这个操作称为增广路径的取反),则新的匹配数就比原匹配数增加了1个。

 

转载自   https://www.cnblogs.com/budapeng/p/3273293.html