二分图的匹配.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二分图的匹配 定 义 二分图:设G=(V,{R})是一个无向图。如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。则称图G为二分图。 匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。 选择这样的边数最大的子集称为图的最大匹配问题(maximal matching problem) 。 实例 增广路径 增广路 (也称增广轨或交错轨):若边集合P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。 由增广路径的定义可以推出下述三个结论: (1) P的路径长度必定为奇数,第一条边和最后一条边都不属于M。 (2) P经过“取反操作”(即非M中的边变为M中的边,原来M中的边去掉)可以得到一个更大的匹配M’。 (3) M为G的最大匹配当且仅当不存在相对于M的增广路径。 匈牙利算法 (1)置M为空; (2)找出一条增广路径P,通过“取反操作”获得更大的匹配M’代替M; (3)重复(2)操作直到找不出增广路径为止; ?匈牙利算法的算法轮廓 ?bool?寻找从k出发的对应项的可增广路{ while(j与k邻接){ ????????if(j不在增广路上){ ????????????把j加入增广路; ????????????if(j是未盖点?或者?从j的对应项出发有可增广路) ????????????????则从k的对应项出有可增广路,返回true; ????????????修改j的对应项为k; ????????} ????} ????从k的对应项出没有可增广路,返回false; } 流程图 C代码 int??? n, m, match[100]; //二分图的两个集合分别含有n和m个元素,match[i]存储集合m中的节点i在集合n中的匹配节点,初值为-1。设当前匹配为M bool??? visited[100], map[100][100]; //map存储邻接矩阵 bool DFS(const int k) { ????? for(int i = 0; i m; i++) ?????????? if( map[k][i] !visited[i]??? ) ????????? { ?????????????? visited[i] = true; ???????????? if( match[i] == -1 || DFS(match[i]) ) //寻找是否为增广路径 ???????? { ???????????match[i] = k;??????????? //路径取反操作。如果match[i]=-1,表示m集合中定点i不在M中,是增广路径;如果match[i]-1,由于DFS(match[i])为true说明找到了增广路径,将定点i在原来M中的边替换掉。(即实现异或操作) ?????????? return true; ????????????? } ????????? } ?????? return false; } void hungary() { ??? for(i = 0; i n; i++) ????? {??? //以二分集中的较小集为n进行匹配较优 ??????memset(visited, 0,sizeof(visited)); ??????if( DFS(i) )???? ++count;??? //count为匹配数 ?????? } 输出 匹配数count; } int main(void) { ?????? int???? count = 0;//统计寻找最大匹配过程中增广路径的条数 ?????? memset(match, -1, sizeof(match));//初始匹配M为空 hungary();//调用匈牙利算法 return 0; } 实例分析 执行过程: hungary函数中第一次循环时,得到增广路径:n1----m1,也就是一个匹配 第二次循环时,得到增广路径:n2----m1----n1----m2,得到新匹配:n2—m1,n1—m2 第三次循环时,得到增广路径:n3—m2—n1—m1---n2----m3,得到新的匹配:n3---m2,n1---m1,n2-m3; 第四次循环时,不能得到增广路径,所以第三次得到的为最大匹配。 练习1:完美的牛栏 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术。不幸的是,由于工程问题,每个牛栏都不一样。第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶。

文档评论(0)

勤能补拙 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档