题目链接:poj 3692
有n个害羞的小男孩,m个害羞的小女孩,男孩之间互相认识,女孩之间互相认识,然后给出一系列男女之间的认识关系。现在要从中选出尽量多的人,使得两两之间相互认识,问最多能选出几个人。
二分图求最大团=总的顶点数-补图最大匹配数
匈牙利算法可解,只不过建图跟普通的二分图不同,普通的二分图认识为1,这里不认识为1
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
#define FFF 205
bool ma[FFF][FFF],vis[FFF];
int match[FFF];
bool dfs(int x)
{
for(int i=1;i<=m;i++)
{
if(!vis[i]&&ma[x][i])
{
vis[i]=true;
if(match[i]==-1||dfs(match[i]))
{
match[i]=x;
return true;
}
}
}
return false;
}
int xiong()
{
int ans=0;
for(int i=1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if(dfs(i))
ans++;
}
return ans;
}
int main()
{
int z,x,y,Case=1;
while(scanf("%d%d%d",&n,&m,&z),n+m+z)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ma[i][j]=true;
memset(match,-1,sizeof(match));
while(z--)
{
scanf("%d%d",&x,&y);
ma[x][y]=false;
}
printf("Case %d: ",Case++);
cout<<n+m-xiong()<<endl;
}
return 0;
}