HDU 2458 - Kindergarten

有一堆男孩和女孩,男孩和男孩之间,女孩和女孩之间互相认识,给出一堆男孩女孩之间认识的关系,

问一个组里最多多少人相互都认识

那么

二分图里

将不认识的连线

那么 相互认识的人最多 就为 最大独立点集

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int map[205][205];
 6 int link[205];
 7 int vis[205];
 8 int n,m,k,ans;
 9 bool dfs(int t)
10 {
11     int x;
12     for(int i=1;i<=m;i++)
13     {
14         if(!vis[i]&&!map[t][i])
15         {
16             vis[i]=1;
17             if(link[i]==-1||dfs(link[i]))
18             {
19                 link[i]=t;
20                 return 1;
21             }
22         }
23     }
24     return 0;
25 }
26 int main()
27 {
28     int i,j,a,b,t=0;
29     while(~scanf("%d%d%d",&n,&m,&k)&&(n+m+k))
30     {
31         memset(map,0,sizeof(map));
32         for(i=1;i<=k;++i)
33         {
34             scanf("%d%d",&a,&b);
35             map[a][b]=1;
36         }
37         memset(link,-1,sizeof(link));
38         ans=0;
39         for(i=1;i<=n;i++)
40         {
41             memset(vis,0,sizeof(vis));
42             if(dfs(i)) ++ans;
43         } 
44         ans=m+n-ans;
45         printf("Case %d: %d\n",++t,ans);
46     }
47 }

 

posted @ 2016-05-19 15:45  nicetomeetu  阅读(145)  评论(0编辑  收藏  举报