资源经验分享完美匹配-匈牙利算法(Hungarian method Edmonds)讲解

完美匹配-匈牙利算法(Hungarian method Edmonds)讲解

2019-12-18 | |  118 |   0

原标题:完美匹配-匈牙利算法(Hungarian method Edmonds)讲解

原文来自:CSDN      原文链接:https://blog.csdn.net/lady_killer9/article/details/103586834


目录

匈牙利算法(Hungarian method Edmonds)

例题

代码实现


匈牙利算法(Hungarian method Edmonds)

以任意一个匹配M作为开始。(可取M=∅。)

  • 若M已饱和X的每个顶点,停止(M为完美匹配)。否则,取X中M-不饱和顶点u,今:S<-{u},T=∅。

  • 若N(S)=T,则停止,算法结束(无完美匹配);否则N(S)⊃T,转到下一步。

  • 取y∈N(S)T,若y为M-饱和的,设yz∈M,则令S=S∪(z),T=T∪{y},转步骤②;否则,y为M-不饱和的,存在M-可扩路P,令M=M△E(P),转到步骤①。

M-饱和的:边uv∈M,则称点u与v为M-饱和的。

M-不饱和的:与点w相关联的所有边都不属于M,则称点m为M-不饱和的。

N(S):点集S的邻集,图中所有与S中的点相邻接的顶点的集合。

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

M-可扩路(增广路)P:属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,起点与终点都是M-不饱和的

E(P): M-可扩路(增广路)P的边的集合。

M△E(P)=(M∪E(P))(M∩E(P))

由可扩路(增广路)的定义可以推出下述三个结论:

(1)P的路径个数必定为奇数,第一条边和最后一条边都不属于M

(2)将M和P进行异或操作可以得到一个更大的匹配M。

(3)M为G的最大匹配当且仅当不存在M的增广路径。

例题

从下图中给定的M={x1y2,x5y4}开始,用匈牙利算法求完美匹配。

 


01.png
初始图


1)M没有饱和X的每个顶点,取X中M-不饱和的顶点x3,令S={x3},T=∅,则N(S)={y1,y2,y3},N(S)⊃T, 取y3∈N(S)T,y3为M-不饱和的,找到M-可扩路P=x3y3,令M=M△E(P)={ x1y2, x3y3,x5y4}


03.png
添加x3y3


2)M没有饱和X的每个顶点,取X中M-不饱和的顶点x2,令S={x2},T=∅,则N(S)={y1},N(S)⊃T, 取y1∈N(S)T,y1为M-不饱和的,找到M-可扩路P=x2y1,令M=M△E(P)={ x1y2,x2y1,x3y3,x5y4}


04.png
添加x2y1


3)M没有饱和X的每个顶点,取X中M-不饱和的顶点x4,令S={x4},T=∅,则N(S)={y2}, N(S)⊃T, 取y2∈N(S)T,y2为M-饱和的,且y2x1∈M(y2x1=x1y2),令S=S∪{x1}={x1, x4},T=T∪{y2}={y2}。

N(S)={y2,y4}, N(S)⊃T, 取y4∈N(S)T,y4为M-饱和的,且y4x5∈M(y4x5=x5y4),令S=S∪{x5}={x1, x4,x5},T=T∪{y4}={y2,y4}。

N(S)={y2,y4,y5}, N(S)⊃T, 取y5∈N(S)T,y5为M-不饱和的,找到M-可扩路P=x4y2x1y4x5y5,令M=M△E(P)={ x1y2,x2y1,x3y3,x5y4}△{x4y2,y2x1,x1y4,y4x5,x5y5}={ x1y4, x2y1,x3y3,x4y2,x5y5},M包含X的每个顶点,停止。

(可扩路的寻找,可以倒推,y5是由于x5引入的,x5是由于y4引入的,y4是由于x1引入的,x1是由于y2引入的,y2是由于刚开始取的x4)


05.png
添加x5y5,x1y4,x4y2,去除x1y2,x5y4


手算验证:M为空,x4仅与y2相连,M={x4y2};x2仅与y1相连M={x2y1,x4y2};x3与y1、y2、y3相连,y1与y2已是M-饱和的,x3仅能与y3匹配,M={x2y1,x3y3,x4y2 };x1与y2、y4相连,y2已是M-饱和的,x1仅能与y4匹配,M={x1y4, x2y1,x3y3,x4y2};仅剩x5与y5,两者是边的两点,匹配即可,故存在完美匹配M={ x1y4, x2y1,x3y3,x4y2,x5y5}。

代码实现

占个坑。。。

更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

 

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:OpenCV输出图像到文件:imwrite()函数。在OpenCV中生成一幅png图片,并写入当前工程目录

下一篇:ElasticSearch Split 切分主分片数

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...