#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 510
using namespace std;
struct Node
{
int v;
int next;
}edge[N*N];
int head[N];
void add_edge( int u, int v, int &i )
{
edge[i].v = v;
edge[i].next = head[u];
head[u] = i ++;
}
char mark[N],vis[N];
int pre[N];
bool dfs( int u )
{
for( int p = head[u];p!=-1; p = edge[p].next )
{
int v = edge[p].v;
if( !vis[v] )
{
vis[v] = 1;
if( pre[v]==-1 || dfs(pre[v]) )
{
pre[v] = u;
return true;
}
}
}
return false;
}
int main()
{
int n,m,v,u;
while(~scanf("%d",&n))
{
int num = 0;
memset(head,-1,sizeof(head));
for( int i = 0; i < n; i ++ )
{
scanf("%d: (%d) ",&u,&m);
for( int i =0; i < m; i ++ )
{
scanf("%d",&v);
add_edge(u,v,num);
}
}
int ans = 0;
memset(pre,-1,sizeof(pre));
for( int i = 0; i < n; i ++ )
{
memset(vis,0,sizeof(vis));
if( dfs(i) ) ans++;
}
printf("%d\n",n-ans/2);
}
return 0;
}
poj 1466
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.