Bipartite Matching (Basic)
#define mx 210
vector < int > g[mx];
int lf[mx],rt[mx],n;
bool vis[mx];
bool dfs(int p) {
int i,j=g[p].size();
for(i=0;i<j;i++) if(!vis[g[p][i]]) {
vis[g[p][i]]=1;
if(rt[g[p][i]]==-1 || dfs(rt[g[p][i]])) {
rt[g[p][i]]=p;
lf[p]=g[p][i];
return true;
}
}
return false;
}
int bpm() {
int i,q=0;
memset(lf,-1,sizeof lf);
memset(rt,-1,sizeof rt);
for(i=0;i<n;i++) {
memset(vis,0,sizeof vis);
if(dfs(i))q++;
}
return q;
}