代码
//maxn,n取二分图两方中点数的最大值,首先init,然后在输入中加边AddEdge, //最后调用solve struct edge { int v,next; }E[2*maxn]; struct TwoMatch { int head[maxn],eid; bool vis[maxn]; int n,To[maxn]; void init(int nn) { n=nn; eid=0; for(int i=1;i<=n;i++) head[i]=-1; } void AddEdge(int u,int v) { E[++eid].v=v; E[eid].next=head[u]; head[u]=eid; } bool dfs(int u) { for(int i=head[u];i!=-1;i=E[i].next) { int v=E[i].v; if(vis[v]) continue; vis[v]=true; if(To[v]==-1||dfs(To[v])) { To[v]=u; return true; } } return false; } int solve() { int ans=0; for(int i=1;i<=n;i++) To[i]=-1; for(int i=1;i<=n;i++) { memset(vis,false,sizeof(vis)); if(dfs(i)) ans++; } return ans; } }tm;