http://acm.hdu.edu.cn/showproblem.php?pid=229

题意:

一个国家有n个城市,m个雷达,我们同时操作的雷达数最多为k,给出城市与国家的坐标,求小于等于k的操作下,雷达覆盖的能够覆盖所有城市的最小覆盖半径。

思路:

城市作为列,雷达作为行,二分枚举雷达的半径+DLX重复覆盖求解。

View Code

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>using namespace std;
//  freopen("data.in","r",stdin);
#define CL(a,num) memset((a),(num),sizeof(a))
#define inf 0x7f7f7f7f
#define M 55
#define N 55
#define maxn 3317const double eps = 1e-8;
const int head = 0;struct node{double x,y;
}city[N],rar[M];int u[maxn],d[maxn],l[maxn],r[maxn],c[maxn],row[maxn];int s[N];
bool hash[M];
int n,m,k;
int size;int dblcmp(double x){if (x > eps) return 1;else if (x < -eps) return -1;else return 0;
}
bool isok(int a,int b,double R){double x = rar[a].x - city[b].x;double y = rar[a].y - city[b].y;double s = x*x + y*y;if (dblcmp(R - s) >= 0) return true;else return false;
}
void init(){int i;for (i = 1; i <= n; ++i){l[i] = i - 1;  r[i] = i + 1;u[i] = d[i] = i;c[i] = i;  s[i] = 0;}l[head] = n; r[head] = 1;r[n] = head;size = n + 1;
}
void build(int R){int i,j;for (i = 1; i <= m; ++i){//枚举行int rh = -1;for (j = 1; j <= n; ++j){//枚举列if (isok(i,j,R)){//满足条件即可以覆盖int x = j;c[size] = x;row[size] = i;s[x]++;u[size] = u[x];d[u[x]] = size;u[x] = size;d[size] = x;if (rh == -1){l[size] = r[size] = size;rh = size;}else{l[size] = l[rh];r[l[rh]] = size;l[rh] = size;r[size] = rh;}size++;}}}
}
void remove(int ci){int i;for (i = d[ci]; i != ci; i = d[i]){l[r[i]] = l[i];r[l[i]] = r[i];}
}
void resume(int ci){int i;for (i = u[ci]; i != ci; i = u[i]){l[r[i]] = r[l[i]] = i;}
}
int h(){int i,j;int res = 0;CL(hash,false);for (i = r[head]; i != head; i = r[i]){if (!hash[i]){res++;hash[i] = true;for (j = d[i]; j != i; j = d[j]){for (int k = r[j]; k != j; k = r[k]){hash[c[k]] = true;}}}}return res;
}
bool dfs(int dep){int i,j;if (dep + h() > k) return false;if (r[head] == head) return true;int MIN = inf, ci = 0;for (i = r[head]; i != head; i = r[i]){if (s[i] < MIN){MIN = s[i];ci = i;}}for (i = d[ci]; i != ci; i = d[i]){remove(i);for (j = r[i]; j != i; j = r[j]){remove(j);}if (dfs(dep + 1)) return true;for (j = l[i]; j != i; j = l[j]){resume(j);}resume(i);}return false;
}
int main(){// freopen("din.txt","r",stdin);int i,j;int T;scanf("%d",&T);while (T--){scanf("%d%d%d",&n,&m,&k);for (i = 1; i <= n; ++i) scanf("%lf%lf",&city[i].x,&city[i].y);for (j = 1; j <= m; ++j) scanf("%lf%lf",&rar[j].x,&rar[j].y);double L = 0, R = 50000.0;double ans = 0;while (dblcmp(R - L) > 0){double mid = (R + L)/2.0;init();build(mid*mid);//这里不知道为啥这么坑爹,我开方求不对。if (dfs(0)){ans = mid;R = mid;}else L = mid;}printf("%.6lf\n",ans);}return 0;
}

hdu 2295 Radar DLX 重复覆盖问题相关推荐

  1. HDU 3498 whosyourdaddy DLX重复覆盖

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=3498 题意: 有 n n个敌人,其中有mm对敌人互为邻居,当你攻击杀死一个敌人时,同时会杀死它所有的邻居 ...

  2. HDU 3498 whosyourdaddy(DLX重复覆盖)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3498         n个点,m条无向边,删除一个点会把与其相邻的点一起删掉,问最少删几次可以删掉所有 ...

  3. hdu 2295 Radar(二分+DLX)

    题目链接:hdu 2295 Radar 题意: 给你n个城市,m个雷达,现在最多用K个雷达,求最小半径覆盖全部的城市. 题解: 二分半径套一个DLX就行.网上随便找的一个板子 1 #include&l ...

  4. hdu - 3498 - whosyourdaddy(重复覆盖DLX)

    题意:N(2 ≤ N ≤ 55)个点,M(0 ≤ M ≤ N*N)条无向边,删除一个点会把与其相邻的点一起删掉,问最少删几次可以删掉所有点. 题目链接:http://acm.hdu.edu.cn/sh ...

  5. [DLX重复覆盖] hdu 3498 whosyourdaddy

    题意: 给N个怪,M个关系. 每个关系代表a和b是邻居. 然后问每次攻击你可以攻击一个怪以及它的全部邻居 问最少需要几次攻击能把怪全部杀死. 思路: 怪为行和列,然后对面每个怪的邻居都是这个怪的列建图 ...

  6. 【HDU】3498 whosyourdaddy 重复覆盖入门题

    传送门:[HDU]3498 whosyourdaddy 题目分析:重复覆盖入门题. 重复覆盖相对于精确覆盖有些地方不同,精确覆盖每次可以删除多行多列,但是重复覆盖每次只能删除一行多列,而且还需要可行性 ...

  7. hdu 2295 Radar 重复覆盖+二分

    题目链接 给m个雷达, n个城市, 以及每个城市的坐标, m个雷达里只能使用k个, 在k个雷达包围所有城市的前提下, 求最小半径. 先求出每个雷达到所有城市的距离, 然后二分半径, 如果距离小于二分的 ...

  8. HDU 3498 whosyourdaddy (可重复覆盖舞蹈链)

    题意: 给出N个点,M个边构成图.每选取一个点都可以覆盖其相邻点,问要覆盖所有点最少选几个点 思路: 每个点都作为一个点集,进行爆搜覆盖,舞蹈链模板题. 代码: #include <bits/s ...

  9. HDU 3498 whosyourdaddy(Dancing_Links重复覆盖)

    题目地址 题意:给你n个城市,m条道路,每次摧毁一个城市会附带把与它直接连接的城市的摧毁,一个城市可以重复摧毁(如果不能重复就是精确覆盖了),问你最少摧毁多少个城市能把所有城市摧毁. 思路:我们可以构 ...

最新文章

  1. PHP上传文件大小限制问题 post_max_size对大小的影响及解决方法
  2. 博客使用的CSS代码备份
  3. 你的女神今日结婚了!!!你失恋了......
  4. python函数参数那些事,关键字参数与位置参数
  5. ViceDinoSpecCtrl.cpp
  6. 石油-美元金融体系的形成
  7. Hadoop集群(第2期)_机器信息分布表
  8. 21Shares AG将于2月4日在瑞士证券交易所SIX推出全球首个波卡ETP
  9. jQuery 判断是否包含某个属性
  10. Win11正式版版号 Win11正式版最新版本号介绍
  11. 【Redis笔记】数据结构和对象:字典
  12. hexo sever端口占用,localhost:4000无响应
  13. 试分析家用变频空调的计算机控制原理,习 题 五
  14. java多线程读取分割的文件_java多线程批量读取文件(二)--读写分离
  15. 【python】基础语法
  16. vue插件集合17:vue获取国家以及地区的方法
  17. java版微信三级分销完整源码
  18. 【办公必备软件】万彩办公大师教程丨PDF转HTML工具
  19. 拼多多店铺如何快速装修?
  20. 这样print才够劲!

热门文章

  1. 【第3篇】python爬虫实战-CSDN个人主页文章列表获取
  2. date工具类 DateUtils.java
  3. android开发realm多线程操作,数据库的设计:深入理解 Realm 的多线程处理机制
  4. Linux4版本,Linux 4.12发布,据传是历史最大版本之一
  5. 3星难度-算式填符号
  6. request.setAttribute()与request.getAttribute()取值问题
  7. java取整数位_java获取整数的各位数值
  8. mysql yum 升级_CentOS 7中升级MySQL 5.7.23的坑与解决方法
  9. oracle的sql的substr用法,oracle中substr函数的用法(sqlserver right)
  10. 湖南师范大学数学与计算机学院郭水霞,湖南师范大学数学与计算机科学学院2013备考手册...