博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3041(最小点覆盖)
阅读量:6914 次
发布时间:2019-06-27

本文共 981 字,大约阅读时间需要 3 分钟。

题意:

假如你如今正处在一个N*N的矩阵中,这个矩阵里面有K个障碍物,你拥有一把武器,一发弹药一次能消灭一行或一列的障碍物,求最小的弹药消灭所有障碍物

输入为:     N K
接下来有K行,每行包括障碍物的坐标,即r行c列;
如:
3 4 
1 1
1 3
2 2
3 2 

输出为:     花费最小的弹药数

思路:将i行作为X集合。将j列作为Y集合。这样原来的问题—用最少的炮弹打掉所有障碍物,转化为了这么一个问题:

在二分图中选择尽量少的点,使得每条边至少有一个端点被选中

裸的最小点覆盖问题,运用结论:最小覆盖数等于最大匹配数  就可以

代码例如以下:

#include
#include
#include
#include
using namespace std;const int N = 600;int n, k;bool lin[N][N];int used[N], arr[N];bool find(int x){ for(int j = 1; j <= n; j++) { if(lin[x][j] == true && used[j] == 0) { used[j] = 1; if(arr[j] == 0 || find(arr[j])) { arr[j] = x; return true; } } } return false;}int main(){ int r, c; while(~scanf("%d%d", &n, &k)) { memset(lin, false , sizeof(lin)); memset(arr, 0, sizeof(arr)); for(int i = 1; i <= k; i++) { scanf("%d%d", &r, &c); lin[r][c] = true; } int all = 0; for(int i = 1; i <= n; i++) { memset(used, 0, sizeof(used)); if(find(i)) all++; } printf("%d\n", all); } return 0;}

转载地址:http://mencl.baihongyu.com/

你可能感兴趣的文章
[zz]hdfs-over-ftp安装
查看>>
iOS学习:UILabel和sizeWithFont方法
查看>>
《人生的智慧》第一章 基本的划分
查看>>
ecshop商品颜色尺寸仿淘宝选择功能教程
查看>>
AJAX实用教程——开篇
查看>>
数据库插入数据返回当前主键ID值方法
查看>>
浅谈三层架构
查看>>
Linux下使用openssl生成证书
查看>>
java设计优化-享元模式
查看>>
Android 获取文件大小
查看>>
linux删除或隐藏命令历史记录history
查看>>
java.lang.OutOfMemoryError: Java heap space
查看>>
认证 (authentication) 和授权 (authorization) 的区别
查看>>
Linux查看磁盘空间大小命令
查看>>
计算机软件著作权查询网址
查看>>
一起谈.NET技术,.Net4.0 Parallel编程(四)Task 上
查看>>
自定义Status Bar的基本方法
查看>>
react动画难写?试试react版transformjs
查看>>
Chrome(12)中使用getComputedStyle获取透明度(opacity)返回字符串不同于其它浏览器...
查看>>
【汉字乱码】IE下GET形式传递汉字。
查看>>