- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
二分图最大匹配整理
二分图最大匹配 2006 12 19 引例 N 项工作分配给N 个人去做,以知每个人可以完成的工作列表,其中每人只能从事一项工作,每项工作只能由一人来完成。问怎样才能完成尽可能多的工作? 相关定义 设G={V, E}是一个无向图。如顶点集V可分割为两个不相交的子集X和Y,并且图中每条边连接的两个顶点都属于两个不同的子集,则称图G为二分图。 给定一个二分图G,在G中若干边组成的集合M中,任意两条边都不与同一个顶点相连,则称M是G的一个匹配。 其中边数最多的匹配叫做二分图的最大匹配。 求二分图的最大匹配 网络流算法: 匈牙利算法:寻找关于当前匹配的增广路径,然后沿增广路径进行增广,将得到一个更大的匹配,重复这一过程,直到找不到增广路径时停止。 增广路径 关于M的增广路径:连接X和Y中两个未匹配顶点的的路径,并且该路径上属于M和不属于M的边交替出现。 增广路径的长度为奇数,第一条边和最后一条边都不属于M。 匹配M上去掉增广路径上原属于M的边,加入增广路径上原不输入M的边,将得到一个更大的匹配。 重复以上过程,当不存在增广路径时,将得到一个最大匹配。 匈牙利算法的具体实现 Boolean型数组 c[u, v]表示原图中u到v之间是否有边。 Boolean型数组 x[k] ( y[k] ) 表示当前寻找增广路径时X ( Y ) 集合中k点是否访问过。 Link[k] : 如果Link[k] 0 则边 ( Link[k], k ) 属于当前匹配 procedure mainwork; 主过程 ans:=0; 匹配的边数 fillchar( link, sizeof(link), 0 ); 当前匹配没有边 for k:=1 to n do 为X中k点寻找匹配边 fillchar(x, sizeof(x), false); fillchar(y, sizeof(y), false); 开始XY都未访问 if find(k) then inc(ans); 找到合适的边 writeln(ans); for k:=1 to n do if link[k] 0 then writeln(link[k],‘ ’,k); 输出匹配 function find(v:integer):boolean; 寻找增广路径 if x[v] then exit(false); 已经访问过v点 x[v]:=true; for i:=1 to n do 寻找没访问过 if c[v,i] and not y[i] then 的Y中的点 y[i]:=true; if (link[i]=0) or find(link[i]) link[i]:=v; exit(true); 找到增广路径 exit(false); 没找到增广路径 引例分析 若a可以完成x, y两项工作,则连 (a, x), (a, y) 两条边 最后求该图的最大匹配。 超级英雄 现在电视台有一种节目叫做超级英雄,大概流程就是每位选手到台上回答主持人的若干个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人总是准备了若干道题目,只有当选手正确回答一道题目后,才能进入下一题,否则就被淘汰.为了增加节目的趣味性并适当降低难度,主持人总提供给选手几个“锦囊妙计”,比如求助现场观众,或者去掉若干个错误答案(选择题)等. 这里,我们把规则稍微改变一下.假设主持人一共有M道题目,选手有N种不同的”锦囊妙计”.主持人规定,每道题目都可以从两种"锦囊妙计"中选择一种,而每种"锦囊妙计"只能使用一次.我们又假设一道题目用了他允许的"锦囊妙计"后,就一定能够正确回答,顺利进入下一题.
文档评论(0)