您的位置:首页 > 其它

poj 3041 构图+最小点覆盖

2015-08-03 13:38 260 查看
题意是草地上有若干个泥泞的地方,可以用木板覆盖一行或者一列,求最少需要多少木板。

这个题的关键在于构图,我们把方格的每一行看成一个结点,每一列看成一个结点,那么容易的看出这是一个二分图,我们在有泥泞的地方连一条边,比如在点i,j处有泥泞,那就在i,j两点连一条边。那么可以容易的看成题目就变成了求二分图的最小点覆盖的问题。代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

int n,m;
int pre[505];
bool a[505][505];
bool f[505];

bool dfs(int x)
{
for (int i=0;i<n;i++)
{
if ((!a[x][i])||(f[i])) continue;
f[i]=1;
if ((pre[i]==-1)||(dfs(pre[i])))
{
pre[i]=x;
return 1;
}
}
return 0;
}

int main()
{
memset(a,0,sizeof(a));
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++)
{
int j,k;
scanf("%d%d",&j,&k);
j--; k--;
a[j][k]=1;
}
for (int i=0;i<n;i++) pre[i]=-1;
int ans=0;
for (int i=0;i<n;i++)
{
memset(f,0,sizeof(f));
ans+=dfs(i);
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: