hdu 2295 Radar 重复覆盖+二分
给m个雷达, n个城市, 以及每个城市的坐标, m个雷达里只能使用k个, 在k个雷达包围所有城市的前提下, 求最小半径。
先求出每个雷达到所有城市的距离, 然后二分半径, 如果距离小于二分的值, 就加边(大概不叫加边, 我也不知道叫什么......
#include<bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, a, n) for(int i = a; i<n; i++)
#define ull unsigned long long
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
const int maxn = ;
const int maxNode = ;
struct node
{
int x, y;
}a[], b[];
struct DLX {
int L[maxNode], R[maxNode], U[maxNode], D[maxNode], row[maxNode], col[maxNode];
int S[maxn], H[maxn], deep, ans[maxn], sz, n, m, k;
double g[][];
void remove(int c) {
for(int i = D[c]; i!=c; i = D[i]) {
L[R[i]] = L[i];
R[L[i]] = R[i];
}
}
void resume(int c) {
for(int i = U[c]; i!=c; i = U[i]) {
L[R[i]] = i;
R[L[i]] = i;
}
}
int h() {
int cnt = ;
int vis[];
mem(vis);
for(int i = R[]; i!=; i = R[i]) {
if(!vis[i]) {
cnt++;
vis[i] = ;
for(int j = D[i]; j!=i; j = D[j]) {
for(int k = R[j]; k!=j; k = R[k]) {
vis[col[k]] = ;
}
}
}
}
return cnt;
}
int dfs(int d) {
if(d+h()>k)
return ;
if(R[] == ) {
return ;
}
int c = R[];
for(int i = R[]; i!=; i = R[i])
if(S[c]>S[i])
c = i;
for(int i = D[c]; i!=c; i = D[i]) {
remove(i);
for(int j = R[i]; j!=i; j = R[j])
remove(j);
if(dfs(d+))
return ;
for(int j = L[i]; j!=i; j = L[j])
resume(j);
resume(i);
}
return ;
}
void add(int r, int c) {
sz++;
row[sz] = r;
col[sz] = c;
S[c]++;
U[sz] = U[c];
D[sz] = c;
D[U[c]] = sz;
U[c] = sz;
if(~H[r]) {
R[sz] = H[r];
L[sz] = L[H[r]];
L[R[sz]] = sz;
R[L[sz]] = sz;
} else {
H[r] = L[sz] = R[sz] = sz;
}
}
void init(){
mem1(H);
for(int i = ; i<=n; i++) {
R[i] = i+;
L[i] = i-;
U[i] = i;
D[i] = i;
}
mem(S);
R[n] = ;
L[] = n;
sz = n;
}
double dis(int i, int j) {
return sqrt(1.0*(b[i].x-a[j].x)*(b[i].x-a[j].x)+(b[i].y-a[j].y)*(b[i].y-a[j].y));
}
int check(double mid) {
init();
for(int i = ; i<=m; i++) {
for(int j = ; j<=n; j++) {
if(mid-g[i][j]>=eps) {
add(i, j);
}
}
}
if(dfs())
return ;
return ;
}
void solve() {
mem(g);
for(int i = ; i<=n; i++)
scanf("%d%d", &a[i].x, &a[i].y);
for(int i = ; i<=m; i++)
scanf("%d%d", &b[i].x, &b[i].y);
for(int i = ; i<=m; i++) {
for(int j = ; j<=n; j++) {
g[i][j] = dis(i, j);
}
}
double l = , r = ;
while(r-l>eps) {
double mid = (l+r)/;
if(check(mid))
r = mid;
else
l = mid;
}
printf("%.6f\n", l);
}
}dlx;
int main()
{
int t;
cin>>t;
while(t--) {
scanf("%d%d%d", &dlx.n, &dlx.m, &dlx.k);
dlx.solve();
}
return ;
}
hdu 2295 Radar 重复覆盖+二分的更多相关文章
- hdu 2295 dlx重复覆盖+二分答案
题目大意: 有一堆雷达工作站,安放至多k个人在这些工作站中,找到一个最小的雷达监控半径可以使k个工作人所在的雷达工作站覆盖所有城市 二分半径的答案,每次利用dlx的重复覆盖来判断这个答案是否正确 #i ...
- HDU 2295 Radar 重复覆盖 DLX
题意: N个城市,M个雷达站,K个操作员,问雷达的半径至少为多大,才能覆盖所有城市.M个雷达中最多只能有K个同时工作. 思路: 二分雷达的半径,看每个雷达可以覆盖哪些城市,然后做重复覆盖,判断这个半径 ...
- (中等) HDU 2295 , DLX+重复覆盖+二分。
Description N cities of the Java Kingdom need to be covered by radars for being in a state of war. S ...
- HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )
以下转自 这里 : 最小支配集问题:二分枚举最小距离,判断可行性.可行性即重复覆盖模型,DLX解之. A*的启发函数: 对当前矩阵来说,选择一个未被控制的列,很明显该列最少需要1个行来控制,所以ans ...
- HDU 2295 Radar (重复覆盖)
Radar Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 2295 Radar dancing links 重复覆盖
就是dancing links 求最小支配集,重复覆盖 精确覆盖时:每次缓存数据的时候,既删除行又删除列(这里的删除列,只是删除表头) 重复覆盖的时候:只删除列,因为可以重复覆盖 然后重复覆盖有一个估 ...
- HDU 2295.Radar (DLX重复覆盖)
2分答案+DLX判断可行 不使用的估计函数的可重复覆盖的搜索树将十分庞大 #include <iostream> #include <cstring> #include < ...
- hdu2295(重复覆盖+二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2295 题意::一个国家有n个城市,有m个地方可以建造雷达,最多可以建K个雷达(K>=1 & ...
- hdu5046(重复覆盖+二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:要在n个城市里建造不超过k个机场覆盖所有城市,问机场城市之间最大距离最小为多少. 分析:二 ...
随机推荐
- JAVA 鲜为人知的二次标记 第六节
又到周末啦,祝各位小伙伴有个愉快的周末.同时也不要忘了学习,上班的同伴们可以利用这两天的时间好好提升自己,在读书的小伙伴们也可以慢慢整理这一周所学到的东西.很多情况下我们看到对自己有用的东西都会保存起 ...
- OpenCV学习(1) RGB颜色空间
1.1彩色空间 颜色是外来的光刺激作用于人的视觉器官而产生的主观感觉,它具有色调.饱和度和亮度三个特性.物体的颜色不仅取决于物体本身,还与光源.周围环境的颜色,以及观察者的视觉系统有关 1.1.1颜色 ...
- javascript 验证身份证
/*身份证号码检索*/ function cardCheck(cartNo) { if (cartNo.val() === "") { return false; } else i ...
- 《UNIX环境高级编程》笔记--线程的标识、创建和终止
1.线程标识 就像每个进程都有一个进程ID一样,每个线程都有一个线程ID.进程ID在整个系统中是唯一的,但线程ID只在它所属的 进程环境中有效. 线程ID使用pthread_t数据类型来表示,实现的时 ...
- Extjs springmvc session 超时 处理
如果你的项目使用ExtJS作为表现层,你会发现,SESSION超时控制将是一个问题.本文将就自己的经验,来解决这一问题,当然,解决问题并非只有一种方法,我只是提出我的方法.首先,做超时控制,必需使用过 ...
- 加载loading的ajax写法
ajaxStart()与ajaxStop():当Ajax请求开始时,会触发ajaxStart()方法的回调函数.当Ajax请求结束时,会触发ajaxStop()方法的回调函数.这些方法都是全局的方法, ...
- scanf和gets的区别
scanf和gets获取字符串时的区别 在C语言中,能构获取字符串的函数至少有两个: 1.scanf() 所在头文件:stdio.h 语法:scanf("格式控制字符串" ...
- client|server 最简单的聊天
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/socket ...
- Python 模块的一般处理
因为Python模块在被导入时,定义在模块中的顶级代码是会被执行的!如果我们想改变这种运行方向可以这样做: if __name__ == '__main__':#当这个模块作为主程序时__name__ ...
- iPhone/iTouch免99美刀真机调试
本文经本人验证,攻略来源于网上,由于多次转载原始出处不可靠,故无法对原作者进行链接引用,抱歉. 本文仅为记录流程,以备日后查询.本文版权所无,欢迎转载和拍砖. 测试环境: XCode 4.0.2 + ...