《二分图最大匹配》-公开课件.pptVIP

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
二分图最大匹配问题 (贪心算法) BY 长郡中学 曹博凯 二分图的基本概念 匹配的基本概念 设G=[V,E]是一个无向图,M属于E是G的若干条边的集合,如果M中的任意两条边都没有公共的端点,就称M是一个匹配。 最大匹配的基本概念 二分图的最大匹配 常用算法 网络流算法(编程复杂,小题大做) 匈牙利算法(理解困难,实现简单) 以上这些我都不会怎么办? 贪心算法 下面,我们引进一种能够完美解决二分图最大匹配问题的贪心算法。 会议安排 一个重要的会议由A公司的M位代表和B公司的N位代表参加(M,N≤1000,代表用1,2,……,M和1,2,……,N表示)。他们被预先分成K(K≤60000)组进行谈判。每组两个人分别来自A公司和B公司。每个参加会议的代表都至少参加了一组谈判。会议为每一个代表都准备了一个房间。技术人员将会在一些房间之间连上直通电话,一个代表至少要和他的一个谈判对手直接联络。连接一个直通电话的价格是常数。技术人员要用尽量少的花费满足会议的要求。 题目分析 这道题目我们很容易将其抽象成为二分图最大匹配的基本模型。我们可以用匈牙利算法求出其最大匹配M,然后所求解即为n+m-M。 可是,考场上并不是每个人都能想到这一巧妙的转换。 于是,我们可以怀抱着一种骗分的心态,构造出一种贪心策略,从而得到满分! 贪心算法 首先,我们将每条无向边拆分成两条反向的有向边,存储在邻接表中。与此同时,我们记录下每个顶点的出度。 然后,我们每次找出一个当前未被访问过的结点中,出度最小的结点u。同时,再在以该结点u为起始点的所有边所对的点中,找出一个同样满足未被访问,且出度最小的结点v。 贪心算法 接着,我们将u,v两点都进行删除操作。 (当u的出边所对的点都已被访问,那么就找不到满足条件的v,因此只对u进行操作) 所谓删除操作,在这里,删除s,其实就是将s的所有出边所对的点t的出度都减一。 (因为要删除点s,即(s,t)也被删除,即(t,s)也要被删除,所以t的出度要减一) 贪心算法 这样循环做下来,我们每做一次都相当于连了一条边(u,v),于是inc(ans)。 同时,我们对这条边的两个端点u,v都做了删除操作(如果可以的话)。每删一个点就inc(tot),直到tot=n+m,即两边的点均被删完。 此时我们得到的ans值即为答案,直接输出即可。 总结 以上就是简单明了的二分图最大匹配的贪心算法。 比起前面所提到的网络流算法和匈牙利算法,都有着无可比拟的优越性。 它不但比前面两个算法都要好理解,而且不及网络流算法的编程复杂度,也不用担心匈牙利算法的递归层数。 注意 以上所述的贪心算法仅适用于二分图的最大匹配问题,最佳匹配问题是不适用的。 本人尚未见到有人能够对此算法给出严格的证明,但是网上确实也有不少人有用此算法过全点的经历。 总之,请各位慎重使用! (:以下附例题的主程序的代码 主程序代码 procedure add(i,j:longint); begin inc(top); v[top]:=j; next[top]:=u[i]; u[i]:=top; inc(degree[i]); end; procedure ins(i:longint); var o:longint; begin visit[i]:=true; inc(tot); o:=u[i]; while o0 do begin dec(degree[v[o]]); o:=next[o]; end; end; begin readln(n,m,k); for a:=1 to k do begin readln(b,c); c:=n+c; add(b,c); add(c,b); end; 主程序代码 n:=n+m; while totn do begin b:=maxlongint;//找结点u for a:=1 to n do if(not visit[a])and(degree[a]b)then begin b:=degree[a]; c:=a; end; a:=u[c]; b:=maxlongint;//找结点v while a0 do begin if(not visit[v[a]])and(degree[

文档评论(0)

saodishenseng2 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档