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  阅读(59)  评论(0)    收藏  举报

编辑推荐:
· 记一次 C# 平台调用中因非托管 union 类型导致的内存访问越界
· [EF Core]聊聊“复合”属性
· 那些被推迟的 C# 14 特性及其背后的故事
· 我最喜欢的 C# 14 新特性
· 程序员究竟要不要写文章
阅读排行:
· 我是不是很有钱?
· 遭遇疯狂 cc 攻击的一个周末
· 【EF Core】聊聊“复合”属性
· GPT‑5 重磅发布
· 美丽而脆弱的天体运动:当C#遇见宇宙混沌
< 2025年8月 >
27 28 29 30 31 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

导航

统计

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