欧拉回路与二分图匹配.docVIP

  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文档。上传文档
查看更多
欧拉回路与二分图匹配

欧拉回路:给定一个无向图,找出一条经过每条边有且仅有一次的路径,这条路径就叫做欧拉路径。如果这条路径的起点和终点是同一个点的话,这条路径就叫做欧拉回路。 定理1:无向图G具有一条欧拉路,当且仅当G是连通的,且有不超过两个奇度定点。 推论:无向图G具有一条欧拉回路,当且仅当G是连通的,且所有定点的度数都为偶数。 欧拉回路算法: procedure finc_circuit(node i); {递归找圈} {Circuitpos表示当前的输出序列长度,circuit表示输出路径} if node I 没有邻接点 then begin circuit(circuitpos)=node I; {加入序列} circuitpos=circuitpos+1; end else while (node i有邻接点) do begin delete_edges(node j, node i); {删除边(I,j)} find_circuit(node j);{继续递归找圈} end; circuit(circuitpos)=node I {加入序列} circuitpos=circuitpos+1 procedure ouler circuitpos=0; {初始化} finc_circuit(node 1); {递归求解}const maxn=100; var e,_a,_b, {e表示边数} nsequence,i,j,n, {nsequence记录输出序列的长度} dep:integer; {dep为栈指针} ok:boolean; map:array[0..maxn,0..maxn] of integer; {记录无向图} stack,sequence:array[0..maxn*maxn] of integer; {栈,输出序列} begin fillchar(map,sizeof(map),0); assign(input,oula.in); reset(input); read(n,e); for i:=1 to e do begin {以边的方式读入} read(_a,_b); inc(map[_a,_b]); end; dep:=1; stack[1]:=1; nsequence:=0; while dep0 do begin j:=stack[dep]; ok:=false; for i:=1 to n do if map[j,i]0 then begin {是否存在邻接点} dec(map[j,i]); dec(map[i,j]); ok:=true; inc(dep); stack[dep]:=i; {入栈} break; end; if not ok then begin inc(nsequence); sequence[nsequence]:=stack[dep]; {加入输出序列} dec(dep); end; end; for i:=1 to nsequence do write(sequence[i], ); writeln; end. 递归程序: const maxn=100; var e,a,b,nsequence,i,j,n:integer; map:array[0..maxn,0..maxn] of integer; sequence:array[0..maxn*maxn] of integer; procedure recursion(location:integer); var ok:boolean; i:integer; begin ok:=false; for i:=1 to n do if map[location,i]0 then begin dec(map[location,i]); dec(map[i,location]); ok:=true; recursion(i); end; if not ok then begin

文档评论(0)

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

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

1亿VIP精品文档

相关文档