证明最大匹配数==最小覆盖点数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx = 1e2 + 10;
int n,m,xi[mx*mx],yi[mx*mx],cp[mx];
bool vis[mx][mx],vic[mx];
bool pipei(int x)
{
for(int i=1;i<=n;i++)
{
if(vis[x][i]&&!vic[i])
{
vic[i] = 1;
if(!cp[i]||pipei(cp[i]))
{
cp[i] = x;
return 1;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int ans = 0;
memset(vis,0,sizeof(vis));
memset(cp,0,sizeof(cp));
for(int i=1;i<=m;i++){
scanf("%d%d",xi+i,yi+i);
vis[xi[i]][yi[i]] = 1;
}
for(int i=1;i<=n;i++){
memset(vic,0,sizeof(vic));
ans += pipei(i);
}
printf("%d\n",ans);
}
}