二分图匹配----匈牙利算法之五

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;
}

  

posted on 2011-07-19 21:38  sysu_mjc  阅读(154)  评论(0编辑  收藏  举报

导航