题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1068
话说二分匹配已经看书研究了两个星期了,POJ训练计划终于刷到二分匹配的地方了。这题是二分匹配第一发,当然是纯模板题。。。
这个题是求最大独立点集,根据最大独立点集=顶点数-最大匹配数,所以转化成了求二分图最大匹配问题。刚开始一直结果一直不对。。后来看题解才知道需要把最大匹配数除以2,再用顶点数减去得到最终结果。原因是这题并没有给出男女,所以是放在一起的,是互相匹配,每个人都用了两遍。所以最终结果应该除以二。代码如下:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <algorithm> using namespace std; int cnt, vis[1010], mp[2000][2000], link[2000], n; int dfs(int a) { int i, j; for(i=0;i<n;i++) { if(!vis[i]&&mp[a][i]) { vis[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=a; return 1; } } } return 0; } int hungary() { int i, ans=0; memset(link,-1,sizeof(link)); for(i=0;i<n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } return ans; } int main() { int i, u, m, v; while(scanf("%d",&n)!=EOF) { cnt=0; memset(mp,0,sizeof(mp)); for(i=0;i<n;i++) { scanf("%d: (%d)",&u,&m); while(m--) { scanf("%d",&v); mp[u][v]=1; } } printf("%d\n",n-hungary()/2); } return 0; }