模板第五个点比正确答案少了1
st数组是用来存遍历到哪一条边的
#include<bits/stdc++.h>
#define maxn 50005
using namespace std;
int n,m,e,ans,st[maxn],v[maxn];
int tot,lnk[maxn],nxt[maxn],son[maxn];
inline int read(){
int ret=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) ret=ret*10+ch-'0',ch=getchar();
return ret;
}
void add(int x,int y){
son[++tot]=y,nxt[tot]=lnk[x],lnk[x]=tot;
}
bool dfs(int x){
if(!v[x]) return 1;
for(int j=st[v[x]];j;j=nxt[j]){
st[v[x]]=nxt[j];
if(dfs(son[j])){
v[son[j]]=v[x];return 1;
}
}
return 0;
}
int main(){
n=read(),m=read(),e=read();
for(int i=1;i<=e;i++){
int x=read(),y=read();bool b=1;
for(int j=lnk[x];j;j=nxt[j]) if(son[j]==y) b=0;
if(b!=0) add(x,y);
}
for(int i=1;i<=n;i++){
for(int j=lnk[i];j;j=nxt[j]){
if(dfs(son[j])){
st[i]=nxt[j],v[son[j]]=i,ans++;break;
}
}
}printf("%d\n",ans);
return 0;
}