poj 3041 Asteroids (二分图的最大匹配 第一题)

题目:http://poj.org/problem?id=3041

题意:在某个n*n的空间内,分布有一些小行星,某人在里面打炮,放一枪后某一行或某一列的行星就都没了,让求最少的打炮数。

然后把每行x或者每列y看成一个点,而障碍物(x,y)可以看做连接x和y的边。按照这种思路构图后。

问题就转化成为选择最少的一些点(x或y),使得从这些点与所有的边相邻,其实这就是最小点覆盖问题。

再利用二分图最大匹配的König定理:最小点覆盖数 = 最大匹配数

现在还是很多地方不会

最小点覆盖:假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖图的所有的边。

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<iomanip>
#include<cmath>
#include<algorithm>
using namespace std; int vis[],G[][],link[];
int n;
int find(int x)
{
int i;
for(i=; i<=n; i++)
{
if(G[x][i]&&!vis[i])
{
vis[i]=;
if(link[i]==||find(link[i]))
{
link[i]=x;
return ;
}
}
}
return ;
}
int main()
{
int k,i,j,x,y,sum;
memset(link,,sizeof(link));
memset(G,,sizeof(G));
cin>>n>>k;
sum=;
for(i=; i<k; i++)
{
cin>>x>>y;
G[x][y]=;
}
for(i=; i<=n; i++)
{
memset(vis,,sizeof(vis));
if(find(i))
sum++;
}
cout<<sum<<endl;
return ;
}

参考博客:http://www.cnblogs.com/pony1993/archive/2012/07/25/2607738.html

http://www.cnblogs.com/kuangbin/archive/2012/08/26/2657446.html

http://www.cnblogs.com/E-star/archive/2012/02/16/2354303.html

上一篇:oracle02


下一篇:CF 277.5 B.BerSU Ball 二分图的最大匹配 模版题