Antenna Placement
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 12104   Accepted: 5954

Description

The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobile phone nets in Sweden. The most striking reason why they got the job, is their discovery of a new, highly noise resistant, antenna. It is called 4DAir, and comes in four types. Each type can only transmit and receive signals in a direction aligned with a (slightly skewed) latitudinal and longitudinal grid, because of the interacting electromagnetic field of the earth. The four types correspond to antennas operating in the directions north, west, south, and east, respectively. Below is an example picture of places of interest, depicted by twelve small rings, and nine 4DAir antennas depicted by ellipses covering them. 
 
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

On the first row of input is a single positive integer n, specifying the number of scenarios that follow. Each scenario begins with a row containing two positive integers h and w, with 1 <= h <= 40 and 0 < w <= 10. Thereafter is a matrix presented, describing the points of interest in Sweden in the form of h lines, each containing w characters from the set ['*','o']. A '*'-character symbolises a point of interest, whereas a 'o'-character represents open space.

Output

For each scenario, output the minimum number of antennas necessary to cover all '*'-entries in the scenario's matrix, on a row of its own.

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 <cstdio>
#include <cstring> using namespace std; const int max_h = ;
const int max_w = ; int h,w;
char s[max_h][max_w]; int n;
int total=,save=,cur;
int direct[][]={{,},{-,},{,},{,-}}; const int max_n=+;
int cx[max_n],cy[max_n],st[max_n];
bool vis[max_n]; struct node
{
int y,nxt;
};
// 这里数组开的小了点,但是刚好够用了,大佬在题解中开了比这大百倍的数组。不知道为什么
// 这个数组的最大用量,应该由add函数的使用上限决定
// 每遍历一个点,最多在上下左右四个方向进行一次add函数的调用,所以只需要4*max_n次即可
node way[]; // 计算在一维数组中的位置
int get(int i,int j)
{
return i*w+j;
} void add(int u,int v)
{
++cur;
// 当前数组中存储邻接点v和st【u】
way[cur].y=v;
way[cur].nxt=st[u];
// st数组存储当u的边在数组中的位置
st[u]=cur;
} int match(int x)
{
for(int i=st[x];i;i=way[i].nxt)
{
int y=way[i].y;
if(!vis[y])
{
vis[y]=;
if(!cy[y] || match(cy[y]))
{
cx[x]=y;
cy[y]=x;
return ;
}
}
}
return ;
} int XYL()
{
memset(cx,,sizeof(cx));
memset(cy,,sizeof(cy));
int ans=;
for(int i=;i<n;++i)
{
// 遍历所有节点,如果找到没有匹配的x,看能否找到与之匹配的y
// 这里加了一步判断,对st[i]不为0的判断,也就是对当前节点不为'o'的判断
// 不加这一个判断也可得出正确的结果,但加入后会有优化,不用再执行之后许多无用的操作
// 毕竟只有'*'的点需要匹配不是吗?
if(!cx[i] && st[i])
{
memset(vis,,sizeof(vis));
ans+=match(i);
}
}
return ans;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
// 输入数据
scanf("%d %d",&h,&w);
for(int i=;i<h;++i)
{
scanf("%s",s[i]);
} // 初始化way数组和st数组
cur=;
memset(st,,sizeof(st));
// n表示总节点数
n=h*w;
// total表示*的总数
total=; for(int i=;i<h;++i)
{
for(int j=;j<w;++j)
{
if(s[i][j]=='*')
{
++ total;
// 检查相邻四个方向
for(int k=;k<;++k)
{
int tx=i+direct[k][];
int ty=j+direct[k][];
// 在图的范围内且为*时,加边
if(tx>= && tx<h && ty>= && ty<w)
{
if(s[tx][ty]=='*')
{
int u=get(i,j);
int v=get(tx,ty);
add(u,v);
// printf("add");
}
}
}
}
}
} //printf("cur:%d\n",tot); printf("%d\n",total-XYL()/);
}
return ;
} /*
2
7 9
ooo**oooo
**oo*ooo*
o*oo**o**
ooooooooo
*******oo
o*o*oo*oo
*******oo
10 1
*
*
*
o
*
*
*
*
*
*
*/

Antenna Placement poj 3020的更多相关文章

  1. Antenna Placement POJ - 3020 (最小边集覆盖)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10699   Accepted: 526 ...

  2. Antenna Placement poj 3020(匹配)

    http://poj.org/problem?id=3020 题意:给定一个n*m的矩阵,'*'代表城市,现在想要用1*2的矩阵将所有的城市覆盖,问最少需要多少个矩阵? 分析:先为每个城市进行标号,再 ...

  3. (匹配 二维建图) Antenna Placement --POJ --3020

    链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...

  4. (匹配)Antenna Placement --POJ --3020

    链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...

  5. Antenna Placement POJ - 3020 二分图匹配 匈牙利 拆点建图 最小路径覆盖

    题意:图没什么用  给出一个地图 地图上有 点 一次可以覆盖2个连续 的点( 左右 或者 上下表示连续)问最少几条边可以使得每个点都被覆盖 最小路径覆盖       最小路径覆盖=|G|-最大匹配数 ...

  6. poj 3020 Antenna Placement(最小路径覆盖 + 构图)

    http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  7. POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】

    链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...

  8. POJ 3020 Antenna Placement 【最小边覆盖】

    传送门:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total ...

  9. POJ 3020——Antenna Placement——————【 最小路径覆盖、奇偶性建图】

    Antenna Placement Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

随机推荐

  1. 配置 Docker 加速器

    Linux curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io ...

  2. 使用 GitHub Actions 实现 Hexo 博客自动部署

    一.Hexo 相关知识点 静态博客简单,但是发布博文时稍显麻烦,一般需要下面两步: hexo clean hexo g -d // 相当于 hexo g + hexo d 如果考虑到同步源文件,还需要 ...

  3. Jmeter之下载文件

    前言 我们可以利用postman工具来测试下载文件的接口,那么假如要利用Jmeter工具来进行下载接口的测试,又该如何测试呢? 下载文件的接口地址:/pinter/file/api/download? ...

  4. 使用Python打造一款间谍程序

    知识点 这次我们使用python来打造一款间谍程序 程序中会用到许多知识点,大致分为四块 win32API  此处可以在MSDN上查看 Python基础重点在cpytes库的使用,使用方法请点击此处 ...

  5. Python3(五) 包、模块、函数与变量作用域

    一.Python项目的组织结构 最顶级的组织结构:包(文件夹) 第二个层级:模块(文件) 第三个层级:类 第四个层级:函数.变量(不属于组织结构,是类本身的特性) 二.Python包与模块的名字 1. ...

  6. 2020 年 中国.NET开发者调查报告

    微信公众号dotnet跨平台2020年初做的一个关于中国.NET开发者调查收到了开发者近 1400 条回复.这份调查报告涵盖了开发者工具链的所有部分,包括编程语言.应用架构.应用服务器.运行时平台.框 ...

  7. iTerm 2 与 oh-my-zsh配合,自定义你的终端。

    参考博客:https://www.cnblogs.com/xishuai/p/mac-iterm2.html 参考博客:https://www.cnblogs.com/sasuke6/p/497607 ...

  8. linux之ls目录处理命令

    目录处理命令:ls 解释 命令名称:ls 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 功能描述:显示目录文件 语法 ls 选项[-ald] [文件或目录] -a 显示所有 ...

  9. SpringBoot安全管理--(三)整合shiro

    简介: Apache Shiro 是一一个开源的轻量级的Java安全框架,它提供身份验证.授权.密码管理以及会话管理等功能. 相对于Spring Security, Shiro框架更加直观.易用,同时 ...

  10. leaflet结合turf.js实现多边形分割(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...