hdu1068 Girls and Boys 二分匹配

题目链接:

二分匹配的应用

求最大独立集

最大独立集等于=顶点数-匹配数

本体中由于男孩和女孩的学号是不分开的,所以匹配数应是求得的匹配数/2

 

代码:  

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 #define maxn  500
 7 int g[maxn][maxn];
 8 int vis_x[maxn];
 9 int vis_y[maxn];
10 int cx[maxn];
11 int cy[maxn];
12 int n;
13 int ans;
14 int path(int u)
15 {
16 
17   vis_x[u]=1;
18   for(int v=0;v<n;v++)
19   {
20      if(vis_y[v]==0 && g[u][v]!=0)
21      {
22         vis_y[v]=1;
23 
24         if(cy[v]==-1 || path(cy[v]))
25         {
26             cx[u]=v;
27             cy[v]=u;
28             return 1;
29         }
30      }
31   }
32   return 0;
33 }
34 void MaxMatch()
35 {
36    memset(cx,-1,sizeof(cx));
37    memset(cy,-1,sizeof(cy));
38 
39    for(int i=0;i<n;i++)
40    {
41       if(cx[i]==-1)
42       {
43          
44         memset(vis_x,0,sizeof(vis_x));
45         memset(vis_y,0,sizeof(vis_y));
46         ans+=path(i);
47       }
48    }
49 }
50 int main()
51 {
52    while(scanf("%d",&n)!=EOF)
53    {
54        int id;
55        int num;
56        char c;
57        ans=0;
58        memset(g,0,sizeof(g));
59       for(int i=0;i<n;i++)
60       {
61        scanf("%d: (%d)", &id,&num);
62         for(int j=0;j<num;j++)
63          {
64              int b;
65              scanf("%d",&b);
66              g[id][b]=1;
67          }
68       }
69          MaxMatch();
70          cout<<n-ans/2<<endl;
71 
72       
73    }
74    return 0;
75 }

 

posted on 2013-11-01 18:03  GyyZyp  阅读(156)  评论(0编辑  收藏  举报

导航