二分图匹配----匈牙利算法之五
poj 3041 Asteroids
//矩阵的行是集合X,矩阵的列是集合Y,将矩阵每一行看成集合X的点,每一列看成集合Y的点,
//这样构成一个二分图,题目就是求二分图的最小覆盖点集(即最少的行和列),转化成二分图的最大匹配
poj 3041 Asteroids
#include<iostream> //求二分图的最小覆盖点集
#include<cstring>
using namespace std;
int n,k,r,c;
int edge[600][600],vis[600],result[600];
bool find(int a)
{
for(int i=1;i<=500;++i)
if(edge[a][i]==1&&vis[i]==0)
{
vis[i]=1;
if(result[i]==0||find(result[i]))
{
result[i]=a;
return true;
}
}
return false;
}
int main()
{
cin>>n>>k;
memset(edge,0,sizeof(edge));
memset(result,0,sizeof(result));
while(k--)
{
cin>>r>>c;
edge[r][c]=1; //第r行第c列有小行星,则将r和c连一条边
}
int ans=0;
for(int i=1;i<=n;++i)
{
memset(vis,0,sizeof(vis));
if(find(i))
ans++;
}
cout<<ans<<endl;
return 0;
}