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可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集。

(来自百度百科)更多关于二分图资料的请自己查找资料

代码:

复制代码
View Code
 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)    收藏  举报

编辑推荐:
· C23和C++26的#embed嵌入资源指南
· 「EF Core」框架是如何识别实体类的属性和主键的
· 独立开发,这条路可行吗?
· 我在厂里搞 wine 的日子
· 如何通过向量化技术比较两段文本是否相似?
阅读排行:
· 推荐 5 款实用的 Docker 可视化管理工具,工作效率翻倍!
· 瞧瞧别人家的接口重试,那叫一个优雅!
· 【EF Core】框架是如何识别实体类的属性和主键的
· MySQL 13 为什么表数据删掉一半,表文件大小不变?
· 上周热点回顾(7.7-7.13)
< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

导航

统计

点击右上角即可分享
微信分享提示