Girls and Boys HDU - 1068
原题链接
考察:二分图
思路:
求最大的集合,该集合内无边相连,即最大独立集.这里比较难把点分成二部分.我们可以直接不分,将每个点看成出度和入度,每条边(不相交)都等价于2个匹配.最后将匹配数\(/2\)即可.
Code
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1010;
int n,match[N];
bool st[N];
vector<int> to[N];
bool dfs(int u)
{
for(int i=0;i<to[u].size();i++)
{
int v = to[u][i];
if(st[v]) continue;
st[v] = 1;
if(!match[v]||dfs(match[v]))
{
match[v] = u;
return 1;
}
}
return 0;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(match,0,sizeof match);
for(int i=0;i<n+5;i++) to[i].clear();
for(int i=0;i<n;i++)
{
int id,sz,j;
scanf("%d: (%d) ",&id,&sz);
while(sz--)
{
scanf("%d",&j);
to[id].push_back(j);
}
}
int res = 0;
for(int i=0;i<n;i++)
{
memset(st,0,sizeof st);
if(dfs(i)) ++res;
}
printf("%d\n",n-res/2);
}
return 0;
}