1匈牙利算法.doc_第1页
1匈牙利算法.doc_第2页
1匈牙利算法.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

匈牙利算法: X部 Y部 X1 Y1 X2 Y2 X3 Y3 X4 Y4 X5 Y5 Y6 (图1)1 如图1,是一个二分图(或偶图)2 任意找一初始匹配,比如:图2(X1Y1,X4Y2,X5Y4)实线所示3寻找一条可增广道路: 该道路的2个端点(起点、终点)是未匹配点 (非饱和点),而且道路是由非匹配边和匹配边 虚线和实线交错出现组成(又称交互道)。如图2:尖头所示(X2Y1-Y1X1-X1Y2-Y2X4-X4Y4-Y4X5-X5Y5)4调整匹配边:把道路上的非匹配边改为匹配边, 匹配边改为非匹配边。这样就可以使匹配边增加 一条(因为增广道路的边为奇数,非匹配边比 匹配边多一条)如图3 (图2)5继续寻找可增广道路,调整,直到不存在可增广道路为止。时间复杂度:O(|V|E|) (图3)匈牙利算法:var map:array1.1000,1.1000 of boolean;from:array1.1000 of integer;used:array1.1000 of boolean;n,m,i,j,count:integer;function change(x:integer):boolean;由X部的顶点x出发,确定一条增广路径var i:integer; begin for i:=1 to m do if mapx,i and not usedi then begin usedi:=true;Y部路径上的点设封锁标志 if (fromi=0) or change(fromi) then fromi=0表示已经找到增广路径;若fromi0,表示已匹配了一条实边,需要回到X部的fromi点,确定路径上的下一个点;虚实交错! begin fromi:=x; 确定一条实边change:=true; exit;end;end;change:=false;已无增广路径end;begin主程序assign(input,input.txt); reset(input);read(n,m);读如二分图,X部与Y部的顶点数repeatread(i,j);if i=0 then break;mapi,j:=true;X部顶点I与Y部顶点J相连until false;close(input);assign(output,output.txt); rewrite(output);count:=0;for i:=1 to n do 枚举X部的顶点beginfillchar(used,sizeof(used),0);每次都冲零!if change(i) then inc(count);若找到一条增广路径,则匹配数加1end;writeln(count);close(output);end.mapi,j记录x中的i和y中j是否可匹配,fromi记录y中的已盖点i连着x中的那个点,如果i是未盖点,则fromi=0,另外在寻找可增广轨时不能有重复,所以用usedi记录x中的i是否被访问过。从x中一未盖点出发,通过交错轨(匹配边和非匹

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论