【模板】二分图匹配-匈牙利算法
#include<cstdio> #include<algorithm> #define N 1010 #define rg register using namespace std; int n,m,E,tot,ans,T,last[N],v[N],from[N]; struct edge{ int to,pre; }e[N*N]; inline int read(){ int k=0,f=1; char c=getchar(); while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); return k*f; } inline void add(int x,int y){e[++tot]=(edge){y,last[x]}; last[x]=tot;} bool dfs(int x){ for(rg int i=last[x],to;i;i=e[i].pre){ if(v[to=e[i].to]!=T){ v[to]=T; if((!from[to])||dfs(from[to])){ from[to]=x; return 1; } } } return 0; } int main(){ n=read(); m=read(); E=read(); for(rg int i=1,x,y;i<=E;i++){ x=read(); y=read(); if(y<=m) add(x,y); } for(rg int i=1;i<=n;i++) ++T,ans+=dfs(i); return printf("%d\n",ans),0; }
洛谷3386