算法设计技巧与分析(十):匹配(Matching)


匹配(Matching)

给定一个无向图G=(V,E),|V|=n和|E|=m。G中的匹配是属于E的子集M,使M中的两条边没有共同的顶点。如果边e属于E在M中,则它是匹配的,否则是不匹配的或自由的。如果顶点v属于V与匹配的边关联,则它是匹配的,否则是不匹配的或自由的。匹配M的大小,即其中匹配边的数量,将用|M|表示。图中的最大匹配是最大基数的匹配。完美匹配是V中的每个顶点都匹配的匹配。

最大匹配问题需要一个子集M属于E具有最大数量的非重叠边;也就是说,M中没有两条边有共同的顶点。

几个重要概念:

  • 给定无向图G=(V,E)中的匹配M,关于M的交替路径(alternating path)p是由匹配边和非匹配边交替组成的简单路径。p的长度用|p|表示。

  • 如果交替路径的两个端点重合,则称为交替循环(alternating cycle)。

  • 如果p中的所有匹配边都在M中且其端点是自由的,则相对于M的交替路径称为相对于M的增广路径(augmenting path)。

重要推论:无向图G中的匹配M最大当且仅当G不包含相对于M的增广路径

一、匈牙利树方法(The Hungarian Tree Method for Bipartite Graphs)

二分图(二部图)

二分图又叫二部图。准确地说:把一个图的顶点划分为两个不相交子集 ,使得每一条边都分别连接两个集合中的顶点。如果存在这样的划分,则此图为一个二分图。

关于二部图有一个重要的定理:G为二部图的充要条件是G中的每一个圈的长度都是偶数。

前面的引理和推论提出了在二分图G中寻找最大匹配的过程:

  • 从任意(例如空)匹配开始,我们在g中找到一条增广路径p,反转p中边的角色(匹配到不匹配,反之亦然),并重复该过程,直到不再有增广路径。

设G=(X并Y、E)是|X|+|Y|=n和|E|=m的二部图。设M是G中的一个匹配。我们称X中的一个顶点为X-顶点(x-vertex)。类似地,Y-顶点(y-vertex)表示Y中的顶点。

首先,我们选取一个自由的X-顶点,比如说r,并将其标记为外部(outer)。从r开始,我们生长一棵交替路径树(alternating path tree),即,从根r到叶子的每一条路径都是交替路径的树。该树称为T,其构造如下:

  • 从r开始,添加将r连接到Y-顶点y的每个不匹配边(r,y),并标记y为内部(inner)。

  • 对于与r相邻的每个Y-顶点y,如果存在匹配边,则将匹配边(y,z)添加到T,并将z标记为外部。

  • 重复上述步骤并延伸树,直到遇到自由Y-顶点或树被阻止,即不能再延伸(请注意,没有顶点多次添加到树中)。

  • 如果找到一个自由的Y-顶点,比如v,那么从根r到v的交替路径就是一条增广路径。另一方面,如果树被阻塞,那么在这种情况下,该树被称为匈牙利树(Hungarian Tree)

  • 接下来,我们从另一个自由x顶点(如果有)开始,并重复上述步骤。

由上述可知,在二分图中,最大匹配和完美匹配并不唯一,其搜索过程如下图所示:

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值