NOCOW-匈牙利算法.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
NOCOW-匈牙利算法

匈牙利算法 求最大匹配的一种显而易见的算法是:先找出全部匹配,然后保留匹配数最 多的。但是这个算法的复杂度为边数的指数级函数。因此,需要寻求一种更 加高效的算法。 增广路的定义(也称增广轨或交错轨):若P 是图G 中一条连通两个未匹配顶 点的路径,并且属M 的边和不属M 的边(即已匹配和待匹配的边)在P 上交替 出现,则称P 为相对于M 的一条增广路径。(M 为一个匹配) 由增广路的定义可以推出下述三个结论: 1. P 的路径长度必定为奇数,第一条边和最后一条边都不属于M。 2. P 经过取反操作可以得到一个更大的匹配M’。 3. M 为G 的最大匹配当且仅当不存在相对于M 的增广路径。 用增广路求最大匹配(称作匈牙利算法,匈牙利数学家Edmonds 于1965 年 提出) 算法轮廓: 1. 置M 为空 2. 找出一条增广路径P,通过取反操作获得更大的匹配M’代替M 3. 重复(2)操作直到找不出增广路径为止 程序清单: parsical const maxm=200; maxn=200; var i,j,k,m,n:longint; g:array[1..maxm,1..maxn]of boolean ; y:array[1..maxn]of boolean ; lk:array[1..maxn]of longint; function find(x:longint):boolean ; var i:longint; begin for i:=1 to n do if g[x,i] and (not y[i]) then begin y[i]:=true; if (lk[i]=0)or find (lk[i]) then begin lk[i]:=x; lk[x]:=i; find:=true; exit; end; end; find:=false ; end; C++ #includestdio.h #includestring.h bool g [201][201]; int n,m,ans; bool b [201]; int link[201]; bool init () { int _x,_y; memset (g,0,sizeof(g)); memset (link,0,sizeof(link)); ans=0; if(scanf(%d%d,n,m)==EOF)return false ; for(int i=1;i=n;i++) { scanf(%d,_x); for(int j=0;j_x;j++) { scanf(%d,_y); g[ i ][_y]=true; } } return true; } bool find (int a) { for(int i=1;i=m;i++) { if(g[a][ i ]==1!b [ i ]) { b [ i ]=true; if(link[ i ]==0 ||find(link[ i ])) {

文档评论(0)

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

教师资格证持证人

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

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档