//Hopcroft_Karp算法 //en=0; //memset(head,-1,sizeof(head)); int en,nx,ny,head[N],mx[N],my[N],dx[N],dy[N]; struct edge{ int x,y,nxt; }e[E]; void addedge(int x,int y){ e[en].x=x; e[en].y=y; e[en].nxt=head[x]; head[x]=en++; } bool bfs(int nx){ bool find=false; int i,cur,v; queue<int> q; memset(dx,0,sizeof(dx)); memset(dy,0,sizeof(dy)); for(i=0;i<nx;i++) if(mx[i]==-1) q.push(i); while(!q.empty()){ cur=q.front(); q.pop(); for(i=head[cur];i!=-1;i=e[i].nxt){ v=e[i].y; if(!dy[v]){ dy[v]=dx[cur]+1; if(my[v]==-1) find=true; else{ dx[my[v]]=dy[v]+1; q.push(my[v]); } } } } return find; } bool dfs(int u){ int i,v; for(i=head[u];i!=-1;i=e[i].nxt){ v=e[i].y; if(dy[v]==dx[u]+1){ dy[v]=0; if(my[v]==-1||dfs(my[v])){ mx[u]=v; my[v]=u; return true; } } } return false; } int Hopcroft_Karp(int nx){ int res=0,i; memset(mx,-1,sizeof(mx)); memset(my,-1,sizeof(my)); while(bfs(nx)) for(i=0;i<nx;i++) if(mx[i]==-1&&dfs(i)) res++; return res; }