求最小点覆盖数 = 最大匹配数
#include<cstdio>
#include<cstring>
bool way[505][505],usedif[505];
int n,m,a,b,link[505];
bool dfs(int s)
{
for(int j=1;j<=n;j++)
{
if(!usedif[j]&&way[s][j])
{
usedif[j] = true;
if(link[j]==0||dfs(link[j]))
{
link[j] = s;
return true;
}
}
}
return false;
}
int match()
{
int sum = 0;
for(int i=1;i<=n;i++)
{
memset(usedif,0,sizeof(usedif));
if(dfs(i))sum++;
}
return sum;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(way,0,sizeof(way));
memset(link,0,sizeof(link));
int m1 = m;
while(m--)
{
scanf("%d%d",&a,&b);
way[a][b] = true;
}
m = m1;
printf("%d\n",match());
}
return 0;
}