以前学习过,复习一下
#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define LL long long
#define pb push_back
#define gcd __gcd
#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)
const int maxn = 1e6+10;
const int inf = 1 << 28;
vector<int> G[maxn];
int vis[maxn];
int matching[maxn];
int Nx,Ny;
bool dfs(int u){
for(int i=0;i<G[u].size();i++){
int v = G[u][i];
if(vis[v])continue;
vis[v]=true;
if(matching[v]==-1||dfs(matching[v])){
matching[v]=u;
return true;
}
}
return false;
}
int hungar(){
int ans = 0;
cl(matching,-1);
for(int i=1;i<=Nx;i++){
cl(vis,0);
if(dfs(i))ans++;
}
return ans;
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<maxn;i++)G[i].clear();
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x].pb(y);
G[y].pb(x);
}
Nx = n;
printf("%d\n",hungar()/2);
}
return 0;
}