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个机场覆盖所有城市,问机场城市之间最大距离最小为多少. 分析:二 ...
随机推荐
- Cannot create JDBC driver of class '' for connect URL 'jdbc:mysql://127.0.0.1:3306/test'
原来的配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http ...
- Csharp多态的实现(抽象类)
1.什么是抽象类 抽象类是虚拟的类,不能创建对象,用abstract修饰,在子类中用override进行重写 抽象类中可以存放抽象方法,属性,也可以存放非抽象方法,属性(这个在下面的代码可以看出来的) ...
- ssh框架的搭建
SSH 为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据持久层和域模块层,以 ...
- JSP基础——关于中文乱码问题
乱码问题十分烦人,今天在写一个登陆的demo时,表单中需要提交的中文姓名,如下代码 <form action="success.jsp" name="success ...
- UNITY使用高通Vuforia导出XCode包编译出错
1.referenced from: in libVuforia.a 此处重新导入引用库并按http://game.ceeger.com/forum/read.php?tid=20447(三楼处理方式 ...
- Mysql中文乱码问题完美解决方案[转]
原文地址 MySQL会出现中文乱码的原因不外乎下列几点:1.server本身设定问题,例如还停留在latin12.table的语系设定问题(包含character与collation)3.客户端程式( ...
- MVC入门
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C 则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.比如一批统计数据可以分别用柱状图.饼图 ...
- “Options模式”下各种类型的Options对象是如何绑定的?
“Options模式”下各种类型的Options对象是如何绑定的? 旨在生成Options对象的配置绑定实现在IConfiguration接口的扩展方法Bind上.配置绑定的目标类型可以是一个简单的基 ...
- android权限列表
原文:[转]android权限列表 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略 ...
- XDocument读取xml的所有元素以及XPath语法
原文 http://www.cnblogs.com/xxyishutong/p/3326375.html <?xml version="1.0" encoding=&quo ...