- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
-节图的匹配
PAGE 1
PAGE 19
第四节 图的匹配PAGE \# 页:# 图表的标号,程序的注释
一、什么是图的匹配
1.图的定义
无向图:无向图G是指非空有限集合VG,和VG中某些元素的无序对的集合EG,构成的二元组(VG,EG)。VG称为G的顶点集,其中的元素称为G的顶点。EG称为G的边集,其中的元素称为G的边。在不混淆的情况下,有时记V=VG,E=EG。如果V={v1,…,vn},那么E中的元素e与V中某两个元素构成的无序对(vi,vj)相对应,记e=vivj,或e=vjvi。在分析问题时,我们通常可以用小圆圈表示顶点,用小圆圈之的连线表示边。
二分图:设G是一个图。如果存在VG的一个划分X,Y,使得G的任何一条边的一个端点在X中,另一个端点在Y中,则称G为二分图,记作G=(X,Y,E)。如果G中X的每个顶点都与Y的每个顶点相邻,则称G为完全二分图。
2.匹配的相关概念
设G=(V,E)是一个图,,如果M不含环且任意两边都不相邻,则称M为G的一个匹配。G中边数最多的匹配称为G的最大匹配。
对于图G=(V,E),在每条边e上赋一个实数权w(e)。设M是G的一个匹配。定义,并称之为匹配M的权。G中权最大的匹配称为G的最大权匹配。如果对一切,e∈E,w(e)=1,则G的最大权匹配就是G的最大匹配。
设M是图G=(V,E)的一个匹配,vi∈V。若vi与M中的边相关联,则称vi是M饱和点,否则称vi为M非饱和点。
如果G中每个顶点都是M饱和点,则称M为G的完美匹配。
设M是G的一个匹配,P是G的一条链。如果P的边交替地一条是M中的边,一条不是M中的边,则称P为M交错链。类似地,我们可以定义G的交错圈。易知,G的交错圈一定是偶圈。
一条连接两个不同的M非饱和点的M交错链称为M增广链。
两个集合S1与S2的“异或”操作S1⊕S2是指集合S1⊕S2=(S1∩S2)\(S1∪S2)
容易看出,设M是G的匹配,P是G中的M增广链、则M⊕P也是G的匹配,而且。
图表 SEQ 图表 \* ARABIC 1 “异或”操作
可以证明,G中匹配M是最大匹配当且仅当G中没有M增广链。
二、匹配算法
1.二分图的最大匹配
设有M个工人x1, x2, …, xm,和N项工作y1, y2, …, yn,规定每个工人至多做一项工作,而每项工作至多分配一名工人去做。由于种种原因,每个工人只能胜任其中的一项或几项工作。问应怎样分配才能使尽可能多的工人分配到他胜任的工作。这个问题称为人员分配问题。
人员分配问题可以用图的语言来表述。令X={x1, x2, …, xm},Y={y1, y2, …,yn},构造二分图G=(X, Y, E)如下:
对于1≤i≤m,1≤j≤n,当且仅当工人xi胜任工作yi时,G中有一条边xiyi,于是人员分配问题就成为在G中求一个最大匹配的问题。
求最大匹配常用匈牙利算法,它的基本思想是:对于已知的匹配M,从X中的任一选定的M非饱和点出发,用标号法寻找M增广链。如果找到M增广链,则M就可以得到增广;否则从X中另一个M非饱和点出发,继续寻找M增广链。重复这个过程直到G中不存在增广链结束,此时的匹配就是G的最大匹配。这个算法通常称为匈牙利算法,因为这里介绍的寻找增广链的标号方法是由匈牙科学者Egerváry最早提出来的。
图表 SEQ 图表 \* ARABIC 2 匈牙利算法
理解了这个算法,就不难写出人员分配问题的解答了。在给出程序之前,先做一些假设:
为了简单起见,假设工人数等于工作数,即N=M,且N≤100,这里,N也可以看作是二分图的|X|和|Y|。
数据从文件input.txt中读入,首先是N和|E|,下面|E|行每行两个数(I, J),表示工人I可以胜任工作J,即二分图中的边xiyj。
结果输出到文件output.txt,第一行是最大匹配数s,下面s行每行两个数(I, J),表示分配工人I做工作J,即匹配边xiyj。
下面是人员分配问题的参考解答,该算法的时间复杂度为O(n3)。
Program match;
const
maxn = 100;
var
map: array[1 .. maxn, 1 .. maxn] of boolean; {保存二分图}
cover: array[1 .. maxn] of boolean; {标记一个点是否为饱和点}
link: array[1 .. maxn] of integer; {保存匹配边}
n: integer; {顶点数}
procedure init; {读入}
var
i, e, x, y: integer;
begin
assign(input, input.txt); reset(input);
re
文档评论(0)