图-网络流-二分图匹配

网络流的一个经典的应用是二分图匹配。在图论中,匹配是指两两没有公共点的边集,而二分图是指:可以把结点集分成两部分X和Y,使得每条边恰好一个端点在X,另一个端点在Y。换句话说,可以把结点进行二染色(bicoloring),使得同色结点不相邻。为了方便叙述,在画图时一般把X结点和Y结点画成左右两列。可以证明:一个图是二分图,当且仅当它不含长度为奇数的圈。

无权图:需要求出包含边数最多的匹配,即二分图的最大基数匹配。

这个问题可以这样求解:增加一个源点s和一个汇点t,从s到所有X结点各连一条容量为1的弧,再从所有Y结点各连一条容量为1的弧到t,最后把每条边变成一条由X指向Y的有向弧,容量为1,。只要求出s到t的最大流,则原图中所有流量为1的弧对应了最大基数匹配。

第二种是针对带权图,需要求出边权之和尽量大的匹配。有些要求这个匹配本身是完美匹配,即每个点都被匹配到,而有些并不对边的数量做出要求,只要权和最大就可以了。下面先考虑前一种情况。

和最大基数匹配类似,只是原图中所有边的费用为权值的相反数(即前面加一个负号),然后其他边的费用为0,然后求一个s到t的最小费用最大流即可。如果从s出发的所有弧并不是全部满载(即流量等于容量),则说明完美不存在,问题无解。否则原图中的所有流量为1的弧对应最大权完美匹配。

这样的方法也可以求解第二种情况,即匹配边数没有限制的最大权匹配,只是需要在求解s-t最小费用流的过程中记录下流量为0,1,2,3时的最小费用流,然后加以比较。

 

 

                                             

 

你可能感兴趣的:(数据结构)