Antenna Placement POJ - 3020 (最小边集覆盖)
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10699 | Accepted: 5265 |
Description

Obviously, it is desirable to use as few antennas as possible, but still provide coverage for each place of interest. We model the problem as follows: Let A be a rectangular matrix describing the surface of Sweden, where an entry of A either is a point of interest, which must be covered by at least one antenna, or empty space. Antennas can only be positioned at an entry in A. When an antenna is placed at row r and column c, this entry is considered covered, but also one of the neighbouring entries (c+1,r),(c,r+1),(c-1,r), or (c,r-1), is covered depending on the type chosen for this particular antenna. What is the least number of antennas for which there exists a placement in A such that all points of interest are covered?
Input
Output
Sample Input
- 2
- 7 9
- ooo**oooo
- **oo*ooo*
- o*oo**o**
- ooooooooo
- *******oo
- o*o*oo*oo
- *******oo
- 10 1
- *
- *
- *
- o
- *
- *
- *
- *
- *
- *
Sample Output
- 17
- 5
Source
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <queue>
- #include <algorithm>
- #include <vector>
- #define mem(a, b) memset(a, b, sizeof(a))
- using namespace std;
- const int maxn = , INF = 0x7fffffff;
- int dx[maxn], dy[maxn], cx[maxn], cy[maxn], used[maxn];
- int nx, ny, dis, n;
- char str[][];
- int gra[][];
- vector<int> G[];
- int dir[][] = {{,},{-,},{,},{,-}};
- int bfs()
- {
- queue<int> Q;
- dis = INF;
- mem(dx, -);
- mem(dy, -);
- for(int i=; i<=nx; i++)
- {
- if(cx[i] == -)
- {
- Q.push(i);
- dx[i] = ;
- }
- }
- while(!Q.empty())
- {
- int u = Q.front(); Q.pop();
- if(dx[u] > dis) break;
- for(int v=; v<G[u].size(); v++)
- {
- int i=G[u][v];
- if(dy[i] == -)
- {
- dy[i] = dx[u] + ;
- if(cy[i] == -) dis = dy[i];
- else
- {
- dx[cy[i]] = dy[i] + ;
- Q.push(cy[i]);
- }
- }
- }
- }
- return dis != INF;
- }
- int dfs(int u)
- {
- for(int v=; v<G[u].size(); v++)
- {
- int i = G[u][v];
- if(!used[i] && dy[i] == dx[u] + )
- {
- used[i] = ;
- if(cy[i] != - && dis == dy[i]) continue;
- if(cy[i] == - || dfs(cy[i]))
- {
- cy[i] = u;
- cx[u] = i;
- return ;
- }
- }
- }
- return ;
- }
- int hk()
- {
- int res = ;
- mem(cx, -);
- mem(cy, -);
- while(bfs())
- {
- mem(used, );
- for(int i=; i<=nx; i++)
- if(cx[i] == - && dfs(i))
- res++;
- }
- return res;
- }
- int main()
- {
- int T, kase = ;
- cin>> T;
- while(T--)
- {
- mem(gra, );
- int ans = ;
- for(int i=; i<maxn; i++) G[i].clear();
- cin>> n;
- for(int i=; i<n; i++)
- {
- cin>> str[i];
- for(int j=; j<n; j++)
- {
- if(str[i][j] == '#')
- gra[i][j] = ++ans;
- }
- }
- for(int i=; i<n; i++)
- {
- for(int j=; j<n; j++)
- {
- if(str[i][j] == '#')
- for(int k=; k<; k++)
- {
- int nx = i + dir[k][];
- int ny = j + dir[k][];
- if(str[nx][ny] == '#' && nx >= && ny >= && nx < n && ny < n)
- G[gra[i][j]].push_back(gra[nx][ny]), G[gra[nx][ny]].push_back(gra[i][j]);
- }
- }
- }
- nx = ny = ans;
- printf("Case %d: %d\n",++kase, hk()/);
- }
- return ;
- }
Antenna Placement POJ - 3020 (最小边集覆盖)的更多相关文章
- Antenna Placement POJ - 3020 二分图匹配 匈牙利 拆点建图 最小路径覆盖
题意:图没什么用 给出一个地图 地图上有 点 一次可以覆盖2个连续 的点( 左右 或者 上下表示连续)问最少几条边可以使得每个点都被覆盖 最小路径覆盖 最小路径覆盖=|G|-最大匹配数 ...
- (匹配 二维建图) Antenna Placement --POJ --3020
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...
- Antenna Placement poj 3020
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12104 Accepted: 595 ...
- Antenna Placement poj 3020(匹配)
http://poj.org/problem?id=3020 题意:给定一个n*m的矩阵,'*'代表城市,现在想要用1*2的矩阵将所有的城市覆盖,问最少需要多少个矩阵? 分析:先为每个城市进行标号,再 ...
- (匹配)Antenna Placement --POJ --3020
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...
- POJ 3216 最小路径覆盖+floyd
Repairing Company Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 6646 Accepted: 178 ...
- poj 1548(最小路径覆盖)
题目链接:http://poj.org/problem?id=1548 思路:最小路径覆盖是很容易想到的(本题就是求最小的路径条数覆盖所有的点),关键是如何建图,其实也不难想到,对于当前点,如果后面的 ...
- POJ3020 Antenna Placement —— 最大匹配 or 最小边覆盖
题目链接:https://vjudge.net/problem/POJ-3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K ...
- poj 3216 (最小路径覆盖)
题意:有n个地方,m个任务,每个任务给出地点,开始的时间和完成需要的时间,问最少派多少工人去可以完成所有的任务.给出任意两点直接到达需要的时间,-1代表不能到达. 思路:很明显的最小路径覆盖问题,刚开 ...
随机推荐
- bash下输入命令的几个常用快捷键
------------------------------------------ 先区分下vi里的命令 快速在行里移动光标 b 是往前部一个单词一个单词的移动 e 是往后部一个单词一个单词的移 ...
- 使用php分页类实现简单分类
分页类參考地址:http://blog.csdn.net/buyingfei8888/article/details/40260127 just soso. 实现分页主要分为4步: 1 引入分页类 2 ...
- struts2_Interceptor
题目要求:要求当未登录访问某些Action时,自动跳转到登录界面. 1. 2. 3. 4. 5.默认拦截器堆栈为defautStack,但一旦用户添加了拦截器,默认拦截器失效 6. 7. struts ...
- 2.3《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——重命名,复制,删除
最常用的文件操作除了将文件列出来外,就应该是重命名,复制,删除了.正如将文件列出来一样,大多数现代操作系统为这些任务提供了用户图形界面,但是在许多场景中,用命令行还是会更方便. 使用mv命令重命名一个 ...
- kettle学习笔记(八)——kettle查询步骤与连接步骤
一.概述 查询步骤: 用来查询数据源里的数据并合并到主数据流中 . 连接步骤: 结果集通过关键字进行连接 .(与前面的UNION不同) 二.查询步骤 1.流查询 流查询示例:(注意上文中的流查询的限制 ...
- 2015520吴思其 基于《Arm试验箱的国密算法应用》课程设计个人报告
20155200吴思其 基于<Arm试验箱的国密算法应用>课程设计个人报告 课程设计中承担的任务 完成试验箱测试功能4,5,6以及SM3加密实验的实现 测试四 GPIO0按键中断实验 实验 ...
- 20155301 Web基础
20155301 Web基础 1.基础问题回答 (1)什么是表单 答: 表单是一个包含表单元素的区域. 表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息的元素 (2)浏 ...
- 【php增删改查实例】 第三节 - mysql 建表
这一节,来给数据库中添加一些测试数据. 登陆mysql: 找到%xampp%\mysql\bin 目录, 在此处打开命令窗口,用root用户登陆mysql 用户表建表sql: CREATE TABLE ...
- 【Qt】QOpenGLWidget展示蒙版效果
关键代码是派生QOpenGLWidget,覆写paintEvent函数 QPainter p; p.begin(this); p.drawImage(QPoint(, ), m_Img); QLine ...
- python高并发和多线程的关系
“高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程 多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发状态的实现. 高并发是一种系 ...