Antenna Placement poj 3020
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 12104 | Accepted: 5954 |
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 <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的更多相关文章
- Antenna Placement POJ - 3020 (最小边集覆盖)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10699 Accepted: 526 ...
- 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 ...
- (匹配)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 二分图匹配 匈牙利 拆点建图 最小路径覆盖
题意:图没什么用 给出一个地图 地图上有 点 一次可以覆盖2个连续 的点( 左右 或者 上下表示连续)问最少几条边可以使得每个点都被覆盖 最小路径覆盖 最小路径覆盖=|G|-最大匹配数 ...
- poj 3020 Antenna Placement(最小路径覆盖 + 构图)
http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- POJ 3020 Antenna Placement 【最小边覆盖】
传送门:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total ...
- POJ 3020——Antenna Placement——————【 最小路径覆盖、奇偶性建图】
Antenna Placement Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
随机推荐
- Codeforces_813
A.统计总时间,从总时间开始找第一个能提交的点. #include<bits/stdc++.h> using namespace std; ],ok[] = {}; int main() ...
- 【OpenGL】OpenGL4.3常用指令目录
参考OpenGL编程指南 第8版 VAO void glGenVertexArrays(GLsizei n, GLuint *arrays); 返回n个未使用的对象名到数组arrays中,用作顶点数组 ...
- javascript json语句 与 js语句的互转
//var data = "weihexin" //var data = ["weihexin", 1] var data = {name:"weih ...
- linux系统的启动流程梳理
1. 不同版本的linux系统的启动流程 1.1 centos6.x系统的启动流程 其详细启动步骤如下: 1)开机,BIOS自检,检查各个硬件是否正常 2)读取硬盘MBR信息,引导系统启动 3)加载g ...
- 3.【Spring Cloud Alibaba】声明式HTTP客户端-Feign
使用Feign实现远程HTTP调用 什么是Feign Feign是Netflix开源的声明式HTTP客户端 GitHub地址:https://github.com/openfeign/feign 实现 ...
- typeof和类型转换
编程形式 ① 面向过程 ② 面向对象 ③ Js既面向过程又面向对象 typeof(数据) 1)typeof(数据)返回该数据是什么类型的 2)写法: ① typeof(数据) ② typeof 数据 ...
- Python 钩子函数详解
###### 钩子函数 ``` import pluggy hookspec = pluggy.HookspecMarker('aaa') hookimpl = pluggy.HookimplMark ...
- 共同战“疫”,CODING 帮助研发团队高效协同
新冠疫情下,家里蹲的日子继续延长.部分企业虽然受困于不能回公司办公,但都陆续开启了远程协作办公,远程协作领域被推上了风口.但「远程协同」看不见摸不着工作伙伴,个人的自律能力也无法保证,难免出现沟通响应 ...
- ORACLE中如何找出大表分布在哪些数据文件中?
ORACLE中如何找出大表分布在哪些数据文件中? 在ORACLE数据中,我们能否找出一个大表的段对象分布在哪些数据文件中呢? 答案是可以,我们可以用下面脚本来找出对应表的区.段分别位于哪些数据文件 ...
- PG数据库常用操作
全量迁移 备份数据 $ pg_dump -h 172.19.235.145 -U <username> -d <database> > 20180704_dbpe.sql ...