/*很裸的一道二分图最大匹配*/ #include<cstdio> #include<iostream> #define N 110 #define inf 1000000000 using namespace std; int head[N],dis[N],q[N],n,n1,cnt=1,S,T; struct node{ int v,f,pre; };node e[N*N]; void add(int u,int v,int f){ e[++cnt].v=v;e[cnt].f=f;e[cnt].pre=head[u];head[u]=cnt; e[++cnt].v=u;e[cnt].f=0;e[cnt].pre=head[v];head[v]=cnt; } bool bfs(){ for(int i=1;i<=T;i++)dis[i]=inf; int h=0,t=1;q[1]=S;dis[S]=0; while(h<t){ int u=q[++h]; for(int i=head[u];i;i=e[i].pre){ int v=e[i].v; if(e[i].f&&dis[v]>dis[u]+1){ dis[v]=dis[u]+1; if(v==T)return true; q[++t]=v; } } } if(dis[T]==inf)return false; return true; } int dinic(int now,int f){ if(now==T)return f; int rest=f; for(int i=head[now];i;i=e[i].pre){ int v=e[i].v; if(e[i].f&&dis[v]==dis[now]+1){ int t=dinic(v,min(e[i].f,rest)); if(!t)dis[v]=0; e[i].f-=t; e[i^1].f+=t; rest-=t; } } return f-rest; } int main(){ freopen("flyer.in","r",stdin); freopen("flyer.out","w",stdout); scanf("%d%d",&n,&n1); S=0,T=n+1; for(int i=1;i<=n1;i++)add(S,i,1); for(int i=n1+1;i<=n;i++)add(i,T,1); int x,y; while(scanf("%d%d",&x,&y)!=EOF)add(x,y,1); int max_flow=0; while(bfs())max_flow+=dinic(S,inf); printf("%d",max_flow); return 0; }
原文:http://www.cnblogs.com/harden/p/6257817.html