原题地址
思路:将行和列转化为顶点,小行星的横坐标与纵坐标建边。即是求最小点覆盖,(最少的点数使得每条边都有点相连),二分图的最小点覆盖即是最大匹配。
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
vector<int>e[510];
int pre[510];
bool used[510];
bool find(int u)
{
int i;
for(i=0;i<e[u].size();i++)
{
int v=e[u][i];
if(!used[v])
{
used[v]=true;
if(pre[v]==-1|| find(pre[v]))
{
pre[v]=u;
return true;
}
}
}
return false;
}
int main()
{
int i,m,n,u,v,res;
while(scanf("%d%d",&n,&m)!=EOF)
{
res=0;
memset(pre,-1,sizeof(pre));
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
e[u].push_back(v);
}
for(i=1;i<=n;i++)
{
memset(used,false,sizeof(used));
if(find(i))
res++;
}
printf("%d\n",res);
}
return 0;
}