#include <iostream>
using namespace std;
#define MAXN 1005
int match[ MAXN ][ MAXN ];
int link[ MAXN ];
int visit[ MAXN ];
int n;
void init()
{
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < n; j ++)
{
match[ i ][ j ] = 0;
}
link[ i ] = -1;
}
}
bool dfs(int x)
{
for(int i = 0; i < n; i ++)
{
if(match[ x ][ i ] == 1 && visit[ i ] == 0)
{
visit[ i ] = 1;
if(link[ i ] == -1 || dfs(link[ i ]))
{
link[ i ] = x;
return true;
}
}
}
return false;
}
int func()
{
int ans = 0;
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < n; j ++)
{
visit[ j ] = 0;
}
if(dfs( i ))
{
ans ++;
}
}
return ans;
}
int main()
{
int a, b, c;
while(scanf("%d", &n) != EOF)
{
int i = 0;
init();
while(i < n)
{
scanf("%d: (%d)", &a, &b);
while(b > 0)
{
scanf("%d",&c);
match[ a ][ c ] = 1;
b --;
}
i ++;
}
printf("%d\n", n - func() / 2);
}
return 0;
}
杭电ACM1068(二分图)
最新推荐文章于 2019-12-03 22:15:37 发布