注意每次搜索时一定要清空上次搜索标记
每次二分图匹配是只从一边开始搜索,另一边在
时已经走过了
且不能连双向边
#include <bits/stdc++.h>
using namespace std;
const int N=1000050;
int n,m,e;
int fir[N],to[N<<1],tot,w[N<<1],nxt[N<<1];
inline int read(){
int cnt=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){cnt=(cnt<<3)+(cnt<<1)+(c^48);c=getchar();}
return cnt*f;
}
void add(int x,int y){nxt[++tot]=fir[x];fir[x]=tot;to[tot]=y;}
bool vis[N];
int match[N];
bool dfs(int x){
for(int i=fir[x];i;i=nxt[i]){
int y=to[i];
if(vis[y])continue;
vis[y]=1;
if(!match[y]||dfs(match[y])){
match[y]=x;
return true;
}
}
return false;
}
int main(){
n=read(),m=read(),e=read();
int u,v;
for(int i=1;i<=e;i++){
u=read(),v=read();
if(v>m||u>n)continue;
add(u,v);
}
int ans=0;
for(int i=1;i<=n;++i){
memset(vis,0,sizeof(vis));
if(dfs(i))ans++;
}
printf("%d",ans);
return 0;
}