给出n个人和他们的感情关系,要求得到一个集合,集合中不存在互相喜欢的人。二分图匹配,由于没有给出性别,所以需要全搜一遍然后除以2,最后用n减去得到正确答案。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int maxn=1111;
int n;
int ans;
int map[maxn][maxn];
int visit[maxn];
int link[maxn];
bool dfs(int k)
{
int j;
for(int i=0;i<n;i++)
{
if(!visit[i]&&map[k][i])
{
visit[i]=1;
j=link[i];
if(j==-1||dfs(j))
{
link[i]=k;
return true;
}
}
}
return false;
}
int hungary()
{
memset(link,-1,sizeof(link));
int sum=0;
for(int i=0;i<n;i++)
{
memset(visit,0,sizeof(visit));
if(dfs(i))
{
sum++;
}
}
return sum;
}
int main()
{
int num;
int x,p;
while(scanf("%d",&n)!=EOF)
{
memset(map,0,sizeof(map));
for(int i=0;i<n;i++)
{
scanf("%d: (%d) ",&p,&num);
//cout<<p<<" "<<num<<endl;
while(num--)
{
scanf("%d",&x);
//map[x][i]=1;
map[p][x]=1;
}
}
cout<<n-(hungary()/2)<<endl;
}
return 0;
}