链接:poj 3041
题意:有一个n*n的矩阵,在矩阵上有m个行星,一个武器能够消灭同一行或者同一列的星星
求最小的要用多少武器消灭全部的星星
思路:把方阵看做一个特殊的二分图(以行列分别作为两个顶点集V1、V2,当中|V1|=|V2|)
然后把每行x或者每列y看成一个点,而障碍物(x,y)能够看做连接x和y的边。依照这样的思路建图,问题就转化成为选择最少的一些点(x或y)。使得从这些点与全部的边相邻,事实上这就是最小点覆盖问题。
最小点覆盖数 = 最大匹配数
这样本题就转化为求最大匹配数了
-
#include<stdio.h>
-
#include<string.h>
-
int edge[550][550],n,used[550],link[550];
-
int dfs(int pos)
-
{
-
int i;
-
for(i=1;i<=n;i++)
-
if(edge[pos][i]&&!used[i]){
-
used[i]=1;
-
if(link[i]==-1||dfs(link[i])){
-
link[i]=pos;
-
return 1;
-
}
-
}
-
return 0;
-
}
-
int main()
-
{
-
int i,a,b,s,m;
-
scanf("%d%d",&n,&m);
-
memset(edge,0,sizeof(edge));
-
for(i=0;i<m;i++){
-
scanf("%d%d",&a,&b);
-
edge[a][b]=1;
-
}
-
s=0;
-
memset(link,-1,sizeof(link));
-
for(i=1;i<=n;i++){
-
memset(used,0,sizeof(used));
-
s+=dfs(i);
-
}
-
printf("%d\n",s);
-
return 0;
-
}