(矫情的匈牙利算法)二分图最大匹配数
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=510,M=100010; int h[N],e[M],ne[M],idx; bool st[N]; int match[N]; int n1,n2,m; void add(int a, int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } bool find(int x){ for(int i=h[x];~i;i=ne[i]){ int j=e[i]; if(!st[j]){ st[j]=true; if(!match[j]||find(match[j])){ match[j]=x; return true; } } } return false; } int main(void){ cin>>n1>>n2>>m; memset(h,-1,sizeof(h)); for(int i=0,a,b;i<m;i++){ cin>>a>>b; add(a,b); } int res=0; for(int i=1;i<=n1;i++){ memset(st,false,sizeof(st)); if(find(i))res++; } cout<<res<<endl; return 0; }