二分图1
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4*4+10;
vector<int>g[maxn];
bool vis[maxn];
int match[maxn];
bool dfs(int x) {
for(int j=0; j<g[x].size(); j++) {
int y=g[x][j];
if(!vis[y]) {
vis[y]=1;
if(!match[y]||dfs(match[y])) {
match[y]=x;
return true;
}
}
}
return false;
}
int main() {
int n,m,k;
cin>>n>>m>>k;
for(int i=1; i<=k; i++) {
int a,b;
cin>>a>>b;
if(a>n||b>m)continue;
g[a].push_back(b);
}
int ans=0;
for(int i=1; i<=n; i++) {
memset(vis,0,sizeof(vis));
if(dfs(i))ans++;
}
cout<<ans;
return 0;
}
注意的地方:dfs函数里面,记得是dfs(match[y])
有向边,因为左右编号可能会重复。