题目可以很容易的转化为先求二分图的最大匹配,然后拿总人数减去最大匹配值就得到最终结果。题目关键是建立关系图,因为是男和女的关系,但输入数据的时候没有说明那个学号是那那个学号是女,所以你就建立一个总人数*总人数的关系矩阵,求得的最大匹配值除以2就可以了,因为相同的增广链你求了两边。
代码如下;


1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<cstring> 5 #include<vector> 6 #define MAXN 1010 7 8 int match[MAXN]; 9 vector<int> map[MAXN]; 10 int vis[MAXN]; 11 int n; 12 int find(int x) 13 { 14 for(int i = 1;i <map[x].size();i++) 15 { 16 int k=map[x][i]; 17 if(map[x][i]&&!vis[k]) 18 { 19 vis[k] = 1; 20 if(!match[k] || find(match[k])) 21 { 22 match[k] = x; 23 return 1; 24 } 25 } 26 } 27 return 0; 28 } 29 int main() 30 { 31 int a,b,c; 32 while(scanf("%d",&n)!=EOF) 33 { 34 for (int i=0;i<=n;i++) 35 { 36 map[i].clear(); 37 match[i]=0; 38 } 39 40 for(int i=0;i<n;i++) 41 { 42 scanf("%d: (%d)",&a,&b); 43 map[a+1].push_back(0); 44 for(int j=0;j<b;j++) 45 { 46 scanf("%d",&c); 47 map[a+1].push_back(c+1); 48 } 49 } 50 51 int ans=0; 52 for(int i=1;i<=n;i++) 53 { 54 memset(vis,0,sizeof(vis)); 55 ans+=find(i); 56 } 57 printf("%d\n",n-ans/2); 58 } 59 return 0; 60 }