题目链接:http://poj.org/problem?id=3692
题意:幼儿园有N(<=200)个小女孩儿,M(<=200)个小男孩儿。女的之间都认识,男的之间都认识。以下P组,每组两个数X和Y,X(女)和Y(男)认识。选出最多的人,互相认识。
思路:最大团=补图的最大独立集=|G|-补图的最大匹配。
#include <iostream>
#include <stdio.h>
using namespace std;
const int MAX=205;
int a[MAX][MAX];
int visit[MAX],link[MAX];
int n,m,p,num=0;
int DFS(int t)
{
int i;
for(i=1;i<=m;i++) if(!visit[i]&&a[t][i])
{
visit[i]=1;
if(link[i]==-1||DFS(link[i]))
{
link[i]=t;
return 1;
}
}
return 0;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&p),n||m||p)
{
int i,j,k1,k2;
for(i=1;i<=n;i++) for(j=1;j<=m;j++) a[i][j]=1;
for(i=1;i<=p;i++)
{
scanf("%d%d",&k1,&k2);
a[k1][k2]=0;
}
memset(link,-1,sizeof(link));
int ans=0;
for(i=1;i<=n;i++)
{
memset(visit,0,sizeof(visit));
if(DFS(i)) ans++;
}
printf("Case %d: %d\n",++num,n+m-ans);
}
return 0;
}