匈牙利算法讲解参考此博客
对于左侧V个节点,E条边的二分图,复杂度为
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5e2+4;
const int M=5e4+4;
int n1,n2,m;
struct Edge {
int v,nxt;
}e[M<<1];
int head[N],etot;
int tot;
int vis[N];
int pre[N];//u--v: pre[v]=u
inline void adde(int u,int v) {
e[++etot].nxt=head[u],e[etot].v=v,head[u]=etot;
}
inline int read() {
int x=0;char c=getchar();
while (c<'0'||c>'9') c=getchar();
while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x;
}
inline bool find(int p,int cur) {
if (vis[p]==cur) return false;
vis[p]=cur;
for (int i=head[p];~i;i=e[i].nxt) {
int v=e[i].v;
if (!pre[v]||find(pre[v],cur)) {
pre[v]=p;
return true;
}
}
return false;
}
int main() {
// freopen("in.txt","r",stdin);
memset(head,-1,sizeof(head));
n1=read(),n2=read(),m=read();
for (register int i=0;i<m;++i) {
int u=read(),v=read();
adde(u,v);
}
for (int i=1;i<=n1;++i)
tot+=find(i,i);
printf("%d\n",tot);
return 0;
}