http://acm.hdu.edu.cn/showproblem.php?pid=1054
二分图最少顶点覆盖,模板题,双向边最后结果/2
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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%*c",&n)){ memset(head,-1,sizeof(head)); cnt=0; for(int i=0;i<n;i++){ int s; scanf("%d%*c%*c%d%*c",&s,&m); for(int j=0;j<m;j++){ int t; scanf("%d%*c",&t); add(s,t);add(t,s); } } printf("%d\n",max_match()/2); } return 0; }