Kindergarten
Description In a kindergarten, there are a lot of kids. All girls of the kids know each other and all boys also know each other. In addition to that, some girls and boys know each other. Now the teachers want to pick some kids to play a game, which need that all players know each other. You are to help to find maximum number of kids the teacher can pick. Input The input consists of multiple test cases. Each test case starts with a line containing three integers The last test case is followed by a line containing three zeros. Output For each test case, print a line containing the test case number( beginning with 1) followed by a integer which is the maximum number of kids the teacher can pick. Sample Input 2 3 3 1 1 1 2 2 3 2 3 5 1 1 1 2 2 1 2 2 2 3 0 0 0 Sample Output Case 1: 3 Case 2: 4 Source |
[Submit] [Go Back] [Status] [Discuss]
题解:
这是一道最大独立集的问题,就是构造一个互不认识的关系图,而且这是个二分图,二分图的最大独立集为总点数-二分匹配数,然后就转化成了最大匹配。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=200+10;
int g[maxn][maxn],match[maxn];
bool used[maxn];
int n,m;
bool bfs(int u)
{
for(int i=1;i<=m;i++)
{
if(g[u][i]&&!used[i])
{
used[i]=true;
if(match[i]<0||bfs(match[i]))
{
match[i]=u;
return true;
}
}
}
return false;
}
int hungry()
{
int ans=0;
memset(match,-1,sizeof(match));
for(int i=1;i<=n;i++)
{
memset(used,false,sizeof(used));
if(bfs(i)) ans++;
}
return ans;
}
int main()
{
int k;
int cas=0;
while(~scanf("%d%d%d",&n,&m,&k))
{
if(n==0&&m==0&&k==0) break;
memset(g,0,sizeof(g));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
g[i][j]=1;
while(k--)
{
int u,v;
scanf("%d%d",&u,&v);
g[u][v]=0;
}
printf("Case %d: %d\n",++cas,n+m-hungry());
}
}