二分图多重匹配

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二分图多重匹配问题

多重匹配是建立在单重匹配的基础上的,我们先回顾下单重匹配的时候,我们用一个数组cm[i]来表示与i匹配的点,而多重匹配的时候我们用的是一个结构体:

struct p

{

int girl[MAXN],num;

}cm[MAXN];

其中cm[i].num代表当前已经有多少个与i进行匹配了,与之匹配的点保存在cm[i].girl[]中。还有一个不同的地方是在找增广路的时候,单重匹配是直接判断cm[i]是否等于-1,即是否已经匹配过,如果没匹配过则找增广路结束,否则沿着cm[i]继续找增广路。多重匹配也是相似的方法,如果与cm[i]匹配的个数少于最大可匹配数的时候,同样找增广路结束,否则沿着所以与cm[i]匹配的点继续找增广路,只要其中有一个点找到了增广路就可以了。

关键代码如下:

if(cm[i].num

{

cm[i].girl[cm[i].num++]=t;

//cn[t]=i;

return 1;

}

else

for(j=0;j

if(dfs(cm[i].girl[j]))

{

cm[i].girl[j]=t;

//cn[t]=i;

return 1;

}

当然,也可以拆点然后用一般的二分图匹配来做。

2. 最大流

此题如果用最大流算法做的话,建图非常简单,直接添加源点S和汇点T,对于每一个MM i连一条Sài,容量为1,对于每一个GG j,连一条jàT,容量为cj,如果GG j想要包养MM i,则连一个iàj,容量为INF的边。然后从S到T求一次最大流,最大流值就是所求的答案(证明略)。

相关文档
最新文档