最大二分图匹配_第1页
最大二分图匹配_第2页
最大二分图匹配_第3页
最大二分图匹配_第4页
最大二分图匹配_第5页
全文预览已结束

下载本文档

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

文档简介

1、最大二分图匹配.txt人永远不知道谁哪次不经意的跟你说了再见之后就真的再也不见了。一分钟有多长?这要看你是蹲在厕所里面,还是等在厕所外面最大二分图匹配 (匈牙利算法) 实现最近队里流行二分图,不能落下,呵呵我也看了。二分图指的是这样一种图:其所有的顶点分成两个集合M和N,其中M或N中任意两个在同一集合中的点都不相连。二分图匹配是指求出一组边,其中的顶点分别在两个集合中,并且任意两条边都没有相同的顶点,这组边叫做二分图的匹配,而所能得到的最大的边的个数,叫做最大匹配。计算二分图的算法有网络流算法和匈牙利算法(目前就知道这两种),其中匈牙利算法是比较巧妙的,具体过程如下(转自组合数学):令g=(x

2、,*,y)是一个二分图,其中x=x1,x2.,y=y1,y2,.令m为g中的任意匹配。1。将x的所有不与m的边关联的顶点表上¥,并称所有的顶点为未扫描的。转到2。2。如果在上一步没有新的标记加到x的顶点上,则停,否则 ,转33。当存在x被标记但未被扫描的顶点时,选择一个被标记但未被扫描的x的顶点,比如xi,用(xi)标记y 的所有顶点,这些顶点被不属于m且尚未标记的边连到xi。现在顶点xi 是被扫描的。如果不存在被标记但未被扫描的顶点,转4。4。如果在步骤3没有新的标记被标记到y的顶点上,则停,否则转5。5。当存在y被标记但未被扫描的顶点时。选择y的一个被标记但未被扫描的顶点,比如yj,用(y

3、j)标记x的顶点,这些顶点被属于m且尚未标记的边连到yj。现在,顶点yj是被扫描的。如果不存在被标记但未被扫描的顶点则转道2。由于每一个顶点最多被标记一次且由于每一个顶点最多被扫描一次,本匹配算法在有限步内终止。代码实现:bfs过程:#include<stdio.h>#include<string.h>main()bool map100300;inti,i1,i2,num,num1,que300,cou,stu,match1100,match2300,pque,p1,now,prev300,n;scanf("%d",&n);for(i=0;i

4、<n;i+)scanf("%d%d",&cou,&stu);memset(map,0,sizeof(map);for(i1=0;i1<cou;i1+)scanf("%d",&num);for(i2=0;i2<num;i2+)scanf("%d",&num1);mapi1num1-1=true;num=0;memset(match1,int(-1),sizeof(match1);memset(match2,int(-1),sizeof(match2);for(i1=0;i1<cou

5、;i1+)p1=0;pque=0;for(i2=0;i2<stu;i2+)if(mapi1i2)previ2=-1;quepque+=i2;elseprevi2=-2;while(p1<pque)now=quep1;if(match2now=-1)break;p1+;for(i2=0;i2<stu;i2+)if(previ2=-2&&mapmatch2nowi2)previ2=now;quepque+=i2;if(p1=pque)continue;while(prevnow>=0)match1match2prevnow=now; match2now=ma

6、tch2prevnow; now=prevnow;match2now=i1;match1i1=now;num+;if(num=cou)printf("YESn");elseprintf("NOn");dfs实现过程:#include<stdio.h>#include<string.h>#define MAX 100bool mapMAXMAX,searchedMAX; int prevMAX,m,n;bool dfs(int data)int i,temp;for(i=0;i<m;i+)if(mapdatai&&am

7、p;!searchedi) searchedi=true;temp=previ;previ=data;if(temp=-1|dfs(temp)return true;previ=temp;return false;main()int num,i,k,temp1,temp2,job;while(scanf("%d",&n)!=EOF&&n!=0) scanf("%d%d",&m,&k);memset(map,0,sizeof(map);memset(prev,int(-1),sizeof(prev); memset(searched,0,sizeof(searched); for(i=0;i<k;i+)scanf("%d%d%d",&job,&temp1,&temp2); if(temp1!=0&&temp2!=0)maptemp1temp2=true;num=0;for(i=

温馨提示

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

评论

0/150

提交评论