HDU 2063--二分匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2063
该题解法思想是:
从第一个女生开始遍历,用女生去选择男生,男生这时还没被选走则马上选走他,接着第二个女生开始选,如果他想要的男生没被选走,当然就选上了,如果该男生已经被选走的话,则开始和前面的选择此男生的女生商量,看她能不能选择别的女生,如果可以的话,就叫该女生选择别的男生,则该男生就属于你了,如果和这个女生商量不成,则换一个男生接着匹配,若没有男生了,则只能守寡了,以此类推……
二分图思想:(匈牙利算法)
二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集。
(来自百度百科)更多关于二分图资料的请自己查找资料
代码:

1 #include<iostream> 2 using namespace std; 3 int visit[1500],map[1500][1500],dx[1500],dy[1500],nx,ny; 4 int dfs(int v) 5 { 6 for(int i=1;i<=ny;i++) 7 { 8 if(map[v][i]&&!visit[i]) 9 { 10 visit[i]=true; 11 if(!dy[i]||dfs(dy[i])) 12 { 13 dy[i]=v; 14 dx[v]=i; 15 return true; 16 } 17 } 18 } 19 return false; 20 } 21 int hungary() 22 { 23 int ans=0; 24 memset(dx,0,sizeof(dx)); 25 memset(dy,0,sizeof(dy)); 26 for(int i=1;i<=nx;i++) 27 { 28 if(!dx[i]) 29 { 30 memset(visit,0,sizeof(visit)); 31 ans+=dfs(i); 32 } 33 } 34 return ans; 35 } 36 int main() 37 { 38 int m,a,b; 39 while(cin>>m,m) 40 { 41 memset(map,0,sizeof(map)); 42 cin>>nx>>ny; 43 while(m--) 44 { 45 cin>>a>>b; 46 map[a][b]=1; 47 } 48 cout<<hungary()<<endl; 49 } 50 return 0; 51 }
posted on 2013-02-04 20:34 acoderworld 阅读(57) 评论(0) 收藏 举报
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C23和C++26的#embed嵌入资源指南
· 「EF Core」框架是如何识别实体类的属性和主键的
· 独立开发,这条路可行吗?
· 我在厂里搞 wine 的日子
· 如何通过向量化技术比较两段文本是否相似?
· 推荐 5 款实用的 Docker 可视化管理工具,工作效率翻倍!
· 瞧瞧别人家的接口重试,那叫一个优雅!
· 【EF Core】框架是如何识别实体类的属性和主键的
· MySQL 13 为什么表数据删掉一半,表文件大小不变?
· 上周热点回顾(7.7-7.13)