原来这就是匈牙利算法,,,
就是用来求二分图最大匹配的算法。。
代码比较短。。
还有就是这里V会是1000, 所以maxn为1005;
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a));
#define sf scanf
#define pf printf
#define LL long long
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
const int maxn=1005;
int V;
vector<int>G[maxn];
int match[maxn];
bool used[maxn];
void addedge(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 biparitte_matching(){
int res=0;
mem(match,-1);
for(int v=0;v<V;++v){
if(match[v]<0){
mem(used,0);
if(dfs(v)){
res++;
}
}
}
return res;
}
int n,k;
int R[10005],C[10005];
int main(){
while(~sf("%d%d",&n,&k)){
V=n*2;
for(int i=1;i<=k;++i){
sf("%d%d",&R[i],&C[i]);
}
for(int i=1;i<=k;++i){
addedge(R[i]-1,n+C[i]-1);//G[i]
}
int res=biparitte_matching();
pf("%d\n",res);
}
}