http://acm.hdu.edu.cn/showproblem.php?pid=1068
应用匈牙利算法第三个扩展,求二分图的最大独立集,但由于路径是双向的,所以求出的最大匹配是实际最大匹配数*2,还要再除回去才行,单向路径就没有这个问题
#include <iostream> #include <cstdio> #include <cstring> using namespace std ; struct node{ int s,t,nxt ; }e[10005] ; int head[5005],vis[5005],match[5005],cnt,n,m ; int find(int s) { for(int i=head[s] ;i!=-1 ;i=e[i].nxt) { int tt=e[i].t ; if(!vis[tt]) { vis[tt]=1 ; if(match[tt]==-1 || find(match[tt])) { match[tt]=s ; return 1 ; } } } return 0 ; } int max_match() { int ans=0 ; memset(match,-1,sizeof(match)) ; for(int i=0 ;i<n ;i++) { memset(vis,0,sizeof(vis)) ; ans+=find(i) ; } return ans ; } void add(int s,int t) { e[cnt].s=s ; e[cnt].t=t ; e[cnt].nxt=head[s] ; head[s]=cnt++ ; } int main() { while(~scanf("%d",&n)) { memset(head,-1,sizeof(head)) ; cnt=0 ; for(int i=0 ;i<n ;i++) { scanf("%*d%*c%*c%*c%d%*c",&m) ; //printf("%d!!\n",m) ; for(int j=0 ;j<m ;j++) { int t ; scanf("%d",&t) ; add(i,t+n) ; } } printf("%d\n",n-max_match()/2) ; } return 0 ; }