n个女生,m个男生。如果女生i愿意让男生j作为parner,那就建边i->j+n,和j+n->i。然后用匈牙利算法算出最大匹配。
要注意N和M都要开2倍。
#include <cstdio> #include <cstring> const int N=505<<1; const int M=1001<<1; struct edge{ int to,next; }e[M]; int head[N],tot; void add(int u,int v){ e[tot].to=v;e[tot].next=head[u];head[u]=tot++; } void init(){ tot=0; memset(head,-1,sizeof head); } int n,vis[N],link[N]; int find(int u) { for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(!vis[v]){ vis[v]=1; if(!link[v]||find(link[v])){ link[v]=u; return 1; } } } return 0; } int solve(){ memset(link,0,sizeof link); int ans=0; for(int i=1;i<=n;i++){ memset(vis,0,sizeof vis); if(find(i))ans++; } return ans; } int main(){ int k,m,u,v; while(scanf("%d",&k),k){ init(); scanf("%d%d",&n,&m); for(int i=1;i<=k;i++){ scanf("%d%d",&u,&v); add(u,v+n); add(v+n,u); } printf("%d ",solve()); } }