poj 3041 构图+最小点覆盖
2015-08-03 13:38
260 查看
题意是草地上有若干个泥泞的地方,可以用木板覆盖一行或者一列,求最少需要多少木板。
这个题的关键在于构图,我们把方格的每一行看成一个结点,每一列看成一个结点,那么容易的看出这是一个二分图,我们在有泥泞的地方连一条边,比如在点i,j处有泥泞,那就在i,j两点连一条边。那么可以容易的看成题目就变成了求二分图的最小点覆盖的问题。代码如下:
这个题的关键在于构图,我们把方格的每一行看成一个结点,每一列看成一个结点,那么容易的看出这是一个二分图,我们在有泥泞的地方连一条边,比如在点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; }
相关文章推荐
- maven 在 mac中的配置
- Linux下快速安装Mysql及使用
- 网络路由设计基础
- git笔记
- C++读取mat文件 & VS2010 环境配置
- Linux C 堆与栈的区别
- 【Unity 教程】对象池
- HNU Knockout Racing
- fatal error LNK1140临时解决方案
- HNU Knockout Racing
- 修改virtualbox的UUID,使virtualbox的虚拟磁盘可以复制
- 给JSP页面添加验证码
- 黑马程序员——java基础_继承、抽象类、接口、多态
- 设计模式 工厂方法模式
- 暴力+构造 Codeforces Round #283 (Div. 2) C. Removing Columns
- Bootstrap的表单
- mysql 导出excel
- C#连接Oracle数据库(直接引用dll使用)
- 瑞士签证和攻略
- 今天搞log4net插入错误日志去mysql数据库的时候出现了点问题,已解决。记录下解决方案