HDU 1068 Girls and Boys

题目可以很容易的转化为先求二分图的最大匹配,然后拿总人数减去最大匹配值就得到最终结果。题目关键是建立关系图,因为是男和女的关系,但输入数据的时候没有说明那个学号是那那个学号是女,所以你就建立一个总人数*总人数的关系矩阵,求得的最大匹配值除以2就可以了,因为相同的增广链你求了两边。

代码如下;

View Code
 1 #include<iostream>
 2 using namespace std;
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<vector> 
 6 #define MAXN 1010 
 7 
 8 int match[MAXN];
 9 vector<int> map[MAXN];
10 int vis[MAXN];
11 int n; 
12 int find(int x)
13 {
14     for(int i = 1;i <map[x].size();i++)
15     {
16         int k=map[x][i]; 
17         if(map[x][i]&&!vis[k])
18         {
19             vis[k] = 1;
20             if(!match[k] || find(match[k]))
21             {
22                 match[k] = x;
23                 return 1;
24             }
25         }
26     }
27     return 0;
28 } 
29 int main()
30 {
31     int a,b,c; 
32     while(scanf("%d",&n)!=EOF)
33     {
34          for (int i=0;i<=n;i++)  
35        {  
36             map[i].clear(); 
37             match[i]=0; 
38         }  
39 
40             for(int i=0;i<n;i++)
41             {
42                 scanf("%d: (%d)",&a,&b);
43                 map[a+1].push_back(0); 
44                 for(int j=0;j<b;j++)
45                 {
46                         scanf("%d",&c);
47                         map[a+1].push_back(c+1);    
48                 } 
49             }
50             
51             int ans=0;
52             for(int i=1;i<=n;i++)
53             {
54                 memset(vis,0,sizeof(vis)); 
55                 ans+=find(i);    
56             }
57             printf("%d\n",n-ans/2);     
58     } 
59     return 0;    
60 } 

 

posted on 2012-08-13 23:27  我的ACM之路  阅读(575)  评论(0编辑  收藏  举报

导航