Problem Address:http://poj.org/problem?id=3041
【思路】
事实上,最小点集覆盖数等于二分图的最大匹配。
以行和列为点,如果某个点有asteroid,则新建一个 i->j 的连接。
则问题变成求最小点集覆盖。
最后求其二分图的最大匹配则为答案。
参考“二分图最大匹配的König定理及其证明”:http://www.cnblogs.com/mjc467621163/articles/2110823.html
【代码】
#include <iostream>
using namespace std;
const int maxn = 500;
bool g[maxn+5][maxn+5];
bool y[maxn+5];
int link[maxn+5];
bool find(int v, int m)
{
int i;
for(i=1;i<=m;i++)
{
if(g[v][i] && !y[i])
{
y[i]=true;
if(link[i]==0 || find(link[i],m))
{
link[i]=v;
return true;
}
}
}
return false;
}
int main()
{
int n, k;
int i, j;
int a, b;
int ct;
scanf("%d %d", &n, &k);
memset(g, false, sizeof(g));
memset(link, 0, sizeof(link));
for (i=0; i<k; i++)
{
scanf("%d %d", &a, &b);
g[a][b] = true;
}
ct = 0;
for(i=1; i<=n ; i++)
{
for (j=0; j<=n; j++)
y[j] = false;
if(find(i, n))
{
ct++;
}
}
printf("%d\n", ct);
return 0;
}