题解:
附上代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int MAX_K=1e4+50;
const int MAX_N=5e2+50;
const int MAX_V=2*MAX_N;
int N,K;
int R[MAX_K],C[MAX_K];
vector<int>G[MAX_V];
int match[MAX_V];
bool used[MAX_V];
void add_edge(int u,int v)
{
G[u].push_back(v);
G[v].push_back(u);
}
bool dfs(int v)
{
used[v]=true;
for(int i=0;i<G[v].size();i++){
int u=G[v][i],w=match[u];
if(w<0||!used[w]&&dfs(w)){
match[v]=u;
match[u]=v;
return true;
}
}
return false;
}
int bipartite_matching()
{
int res=0;
memset(match,-1,sizeof(match));
for(int v=0;v<N;v++){
if(match[v]<0){
memset(used,0,sizeof(used));
if(dfs(v)){
res++;
}
}
}
return res;
}
int main()
{
scanf("%d%d",&N,&K);
for(int i=0;i<K;i++){
scanf("%d%d",&R[i],&C[i]);
add_edge(R[i]-1,N+C[i]-1);
}
printf("%d\n",bipartite_matching());
return 0;
}