二分图匹配——学习匹配

匹配:一张图G中两两没有没有公共点的边的集合(简称边集)

二分图:可以把点集分为两个集合X和Y,使得每条边的端点一个属于X另一个属于Y的一张图。原理上我们可以把这种图的结点进行二染色并使得同色结点不相邻。(可以证明:一个图是二分图,当且仅当他不含长度为奇数的圈【奇圈】)

二分图最大基数匹配:针对无权图,求出包含边数最多的匹配。即二分图最大基数匹配。上有O(n*m)的匈牙利算法,同时我们也可以将其转化为网络最大流来求解。将X集合中的所有点都连向源点S,Y集合中的所有点都连向汇点T。原来二分图所有的无向边的方向都变为从X指向Y,且使得所边的容量都变为1。要使图中流量尽可能的大,就要使二分图中匹配的边尽可能的多。不难看出,当原图达到最大流时,所有流量为1的弧对应了最大基数匹配。

二分图最大权完美匹配:针对带权图,需要求出边权之和尽可能大的匹配且要求每个点都要被访问到。算法和最大基数匹配类似,只是原图中所有边的费用为权值的相反数,然后其他边的费用为0。跑一遍最小费用最大流即可。如果从S出发的弧并不是全部满载,则无解;否则原图中所有流量为1的弧对应最大权完美匹配。

这种方法也可以求解最大权匹配(并不要求每个点都被匹配到)需要记录下求解s-t最小费用流的过程中记录下流量为0,1,2,3…时的最小费用流,然后加以比较。

猜你喜欢

转载自blog.csdn.net/xyc1719/article/details/81252730