题意:有n个人,有的之间有爱慕关系,问最多能找出多少个人使得找出的人中没有爱慕关系。
思路:二分图啊,最大独立集=点数-最大匹配数。
一开始想染色分性别来搞,后来发现没有必要,左边从0到n-1,右边也0到n-1,有爱慕关系的连线,然后找最大匹配数,注意,这样找到的最大匹配数是有爱慕关系的对数的2倍,也就是实际的最大匹配数是这个的一般,然后减一下就好了。
反省:手贱,把int l[505]写成了int l[105],然后wa了两发,该醒醒了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,l[505],p[505][505],ans;
bool vis[505];
bool go(int x)
{
for(int i=0;i<n;i++)
{
if(!vis[i]&&p[x][i])
{
vis[i]=1;
if(l[i]==-1||go(l[i]))
{
l[i]=x;
return true;
}
}
}
return false;
}
int main()
{
int u,num,v;
while(scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p));
memset(l,-1,sizeof(l));
for(int i=0;i<n;i++)
{
scanf("%d: ",&u);
scanf("(%d) ",&num);
for(int j=0;j<num;j++)
{
scanf("%d",&v);
p[u][v]=1;
}
}
ans=0;
for(int i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
if(go(i))ans++;
}
printf("%d\n",n-ans/2);
}
return 0;
}