Description
Input
the number of students
the description of each student, in the following format
student_identifier:(number_of_romantic_relations) student_identifier1 student_identifier2 student_identifier3 ...
or
student_identifier:(0)
The student_identifier is an integer number between 0 and n-1 (n <=500 ), for n subjects.
Output
Sample Input
7 0: (3) 4 5 6 1: (2) 4 6 2: (0) 3: (0) 4: (2) 0 1 5: (1) 0 6: (2) 0 1 3 0: (2) 1 2 1: (1) 0 2: (1) 0
Sample Output
5 2
//
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=600;//N不能太大 否则超时
int cap[N][N];//初始化要清零
int _link[N];
bool used[N];
int nx,ny;//1->nx
bool _find(int t)
{
for(int i=1;i<=ny;i++)
if(!used[i]&&cap[t][i]==1)
{
used[i]=true;
if(_link[i]==-1||_find(_link[i]))
{
_link[i]=t;
return true;
}
}
return false;
}
int MaxMatch()
{
int num=0;
memset(_link,-1,sizeof(_link));
for(int i=1;i<=nx;i++)
{
memset(used,false,sizeof(used));
if(_find(i)) num++;
}
return num;
}
//最大点独立集=N-最小点覆盖=N-最大匹配
//此题中男女关系重复两次,所以最后要N-最大匹配/2
int main()
{
int n;
while (scanf("%d",&n) != EOF)
{
nx=ny=n;
//输入数据并进行初始化
memset(cap,0,sizeof(cap));
for (int i=1;i<=n;i++)
{
int x;
scanf("%d : (%d)",&x,&x);
for (int j=1;j<=x;j++)
{
int y;scanf("%d",&y);y++;
cap[i][y]=1;
}
}
printf("%d\n",n-MaxMatch()/2); //输出最大独立集
}
return 0;
}