建双向边,然后最大匹配/2。另外邻接矩阵会T..
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 1505;
struct node{
int to, nxt;
}e[N*N];
int head[N];
int cnt;
int n;
int link[N], vis[N];
void add( int u, int v )
{
e[cnt].to = v;
e[cnt].nxt = head[u];
head[u] = cnt++;
e[cnt].to = u;
e[cnt].nxt = head[v];
head[v] = cnt++;
}
int dfs( int u )
{
for( int i = head[u]; ~i; i = e[i].nxt )
{
int to = e[i].to;
if( !vis[to] )
{
vis[to] = 1;
if( link[to] == -1 || dfs(link[to]) )
{
link[to] = u;
return 1;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d", &n))
{
int src, m;
cnt = 0;
memset(head, -1, sizeof(head));
for( int i = 1; i <= n; i++ )
{
int to;
scanf("%d:(%d)", &src, &m);
src++;
while(m--)
{
scanf("%d", &to);
to++;
add(src, to);
}
}
int ans = 0;
memset(link, -1, sizeof(link));
for( int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis));
ans += dfs(i);
}
printf("%d\n", ans/2);
}
return 0;
}