HDU 1068 boys and girls(最大独立集)

思路:先求最大匹配数cnt,结果为最大独立集的对数:(2*n-cnt)/2 对. (题目保证对数为奇数)


#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
#define LL long long
#define M 210
#define DEBUG puts("It's here!")
#define INF 1<<29
#define CLS(x,v) memset(x,v,sizeof(x))
#define FOR(i,a,n) for(int i=(a);i<(n);++i)


int link[M],vis[M];
int graph[M][M];
int n;
int DFS(int x)
{
for(int i=0; i<n; i++)
if(!vis[i]&&graph[x][i])
{
vis[i]=1;
if(link[i]==-1||DFS(link[i]))
{
link[i]=x;
return 1;
}
}
return 0;
}
int main()
{
int a,b,k;
while(~scanf("%d",&n))
{
CLS(graph,0);
for(int i=0;i<n;i++){
scanf("%d: ",&a);
scanf("(%d)",&k);
for(int j=0;j<k;j++)
{
scanf("%d",&b);
graph[a][b]=1;
}
}
CLS(link,-1);
int cnt=0;
for(int i=0; i<n; i++)
{
CLS(vis,0);
if(DFS(i))cnt++;
}
printf("%d\n",n-cnt/2);
}
return 0;
}