HDU 2295.Radar (DLX重复覆盖)

时间:2023-01-07 07:30:11

2分答案+DLX判断可行

不使用的估计函数的可重复覆盖的搜索树将十分庞大

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std; #define FOR(i,A,s) for(int i = A[s]; i != s; i = A[i])
#define exp 1e-8 const int MAX = , MAXR = , MAXC = ;
int n, m, k, t; struct DLX {
int n, Size;//Size为尾指针,真正大小
int row[MAX], col[MAX];//记录每个点的行列
int U[MAX], D[MAX], R[MAX], L[MAX]; //4个链表
int S[MAXC];//每列1的个数
int ncnt, ans[MAXR];
void init (int n) {
this->n = n;
//增加n+1个辅助链表,从0到n
for (int i = ; i <= n; i++)
U[i] = D[i] = i, L[i] = i - , R[i] = i + ;
R[n] = , L[] = n; //头尾相接
Size = n + ;
memset (S, , sizeof S);
}
//逐行添加
void addRow (int r, int columns[]) {
int first = Size;
for (int i = ; i <= n ; i++) {
if (columns[i] == ) continue;
int c = i;
L[Size] = Size - , R[Size] = Size + ;
U[Size] = U[c], D[Size] = c;//插入第c列
D[U[c]] = Size, U[c] = Size; //注意顺序!!!
row[Size] = r, col[Size] = c;
Size++, S[c]++;
}
if (Size > first)
R[Size - ] = first, L[first] = Size - ; //头尾相接
}
void Remove (int c) {
//精确覆盖
// L[R[c]] = L[c], R[L[c]] = R[c];
// FOR (i, D, c)
// FOR (j, R, i)
// U[D[j]] = U[j], D[U[j]] = D[j], --S[col[j]];
//重复覆盖
for (int i = D[c]; i != c; i = D[i])
L[R[i]] = L[i], R[L[i]] = R[i];
}
void Restore (int c) {
// FOR (i, U, c)
// FOR (j, L, i)
// ++S[col[j]], U[D[j]] = j, D[U[j]] = j;
// L[R[c]] = c, R[L[c]] = c;
//重复覆盖
for (int i = U[c]; i != c; i = U[i])
L[R[i]] = R[L[i]] = i;
}
bool v[MAX];
int ff()
{
int ret = ;
for (int c = R[]; c != ; c = R[c]) v[c] = true;
for (int c = R[]; c != ; c = R[c])
if (v[c])
{
ret++;
v[c] = false;
for (int i = D[c]; i != c; i = D[i])
for (int j = R[i]; j != i; j = R[j])
v[col[j]] = false;
}
return ret;
}
bool dfs (int d) {
if (d + ff() > k) return ;
if (R[] == ) {
ncnt = d;
return d <= k;
}
int c = R[];
for (int i = R[]; i != ; i = R[i])
if (S[i] < S[c])
c = i;
//Remove (c);//精确覆盖
FOR (i, D, c) {
Remove (i);//重复覆盖
ans[d] = row[i];
//FOR (j, R, i) Remove (col[j]);
FOR (j, R, i) Remove (j);
if (dfs (d + ) ) return ;
//FOR (j, L, i) Restore (col[j]);
FOR (j, L, i) Restore (j);
Restore (i);//重复覆盖
}
//Restore (c);//精确覆盖
return ;
}
bool solve (vector<int> &v) {
v.clear();
if (!dfs () ) return ;
for (int i = ; i < ncnt; i++) v.push_back (ans[i]);
return ;
}
} f;
struct node {
int x, y;
} g[], Ra[];
int columns[][];
double dis[][];
inline double getdis (node a, node b) {
return sqrt (double ( (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) ) );
}
bool make (double mid) {
f.init (n);
for (int i = ; i <= m; i++)
for (int j = ; j <= n; j++)
columns[i][j] = dis[i][j] <= mid;
for (int i = ; i <= m; i++)
f.addRow (i, columns[i]);
return f.dfs ();
}
int main() {
scanf ("%d", &t);
while (t--) {
scanf ("%d %d %d", &n, &m, &k);
for (int i = ; i <= n; i++)
scanf ("%d %d", &g[i].x, &g[i].y);
for (int i = ; i <= m; i++)
scanf ("%d %d", &Ra[i].x, &Ra[i].y);
double l = 1e9, r = ;
for (int i = ; i <= m; i++)
for (int j = ; j <= n; j++) {
dis[i][j] = getdis (Ra[i], g[j]);
l = min (dis[i][j], l), r = max (r, dis[i][j]);
}
double ans = -;
while (r - l > 1e-) {
double mid = (r + l) / .;
if (make (mid) ) {
ans = mid;
r = mid - exp;
}
else
l = mid + exp;
}
printf ("%.6f\n", ans);
}
return ;
}

HDU 2295.Radar (DLX重复覆盖)的更多相关文章

  1. HDU 2295 Radar (重复覆盖)

    Radar Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. HDU 2295 Radar &lpar;DLX &plus; 二分&rpar;

    Radar Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. &lbrack;ACM&rsqb; HDU 2295 Radar &lpar;二分法&plus;DLX 重复覆盖)

    Radar Problem Description N cities of the Java Kingdom need to be covered by radars for being in a s ...

  4. HDU 2295 Radar 重复覆盖 DLX

    题意: N个城市,M个雷达站,K个操作员,问雷达的半径至少为多大,才能覆盖所有城市.M个雷达中最多只能有K个同时工作. 思路: 二分雷达的半径,看每个雷达可以覆盖哪些城市,然后做重复覆盖,判断这个半径 ...

  5. HDU 2295 Radar (二分 &plus; Dancing Links 重复覆盖模型 )

    以下转自 这里 : 最小支配集问题:二分枚举最小距离,判断可行性.可行性即重复覆盖模型,DLX解之. A*的启发函数: 对当前矩阵来说,选择一个未被控制的列,很明显该列最少需要1个行来控制,所以ans ...

  6. hdu 2295 dlx重复覆盖&plus;二分答案

    题目大意: 有一堆雷达工作站,安放至多k个人在这些工作站中,找到一个最小的雷达监控半径可以使k个工作人所在的雷达工作站覆盖所有城市 二分半径的答案,每次利用dlx的重复覆盖来判断这个答案是否正确 #i ...

  7. HDU 2295 Radar dancing links 重复覆盖

    就是dancing links 求最小支配集,重复覆盖 精确覆盖时:每次缓存数据的时候,既删除行又删除列(这里的删除列,只是删除表头) 重复覆盖的时候:只删除列,因为可以重复覆盖 然后重复覆盖有一个估 ...

  8. HDU 5046 Airport【DLX重复覆盖】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意: 给定n个城市的坐标,要在城市中建k个飞机场,使城市距离最近的飞机场的最长距离最小,求这 ...

  9. &lpar;中等&rpar; HDU 3335 &comma; DLX&plus;重复覆盖。

    Description As we know,the fzu AekdyCoin is famous of math,especially in the field of number theory. ...

随机推荐

  1. linux之cp&sol;scp命令+scp命令详解&lpar;转&rpar;

    名称:cp 使用权限:所有使用者 使用方式: cp [options] source dest cp [options] source... directory 说明:将一个档案拷贝至另一档案,或将数 ...

  2. Becoming a Data Scientist – Curriculum via Metromap

    From: http://nirvacana.com/thoughts/becoming-a-data-scientist/ Data Science, Machine Learning, Big D ...

  3. Template&lowbar;5模板拾遗1

    1,typename和class模板参数作为类的时候只能用classtemplate<typename T, template<typename ELEM> class CONT = ...

  4. 新一代分布式任务调度框架:当当elastic-job开源项目的10项特性

    作者简介: 张亮,当当网架构师.当当技术委员会成员.消息中间件组负责人.对架构设计.分布式.优雅代码等领域兴趣浓厚.目前主导当当应用框架ddframe研发,并负责推广及撰写技术白皮书.   一.为什么 ...

  5. Gink掉过的坑(一):将CCTableView导入到lua中

    环境: 系统:win7 64位 cocos2dx:cocos2d-2.1rc0-x-2.1.3 Visual Studio: 2012 由于项目是用lua写的,需要将cocos2dx中的方法导入到lu ...

  6. &lbrack;工具&rsqb; Altova UModel&&num;174&semi; 2017 is a UML tool for software modeling &amp&semi; application development&period;

    https://cdn.sw.altova.com/v2017sp2a/en/MissionKitEnt2017sp2.exe https://cdn.sw.altova.com/v2017sp2a/ ...

  7. Xamarin 技术解析

    Xamarin 是一套基于C#语言的跨平台移动应用开发工具,今年2月份微软宣布收购Xamarin,而后在4月份进行的Build大会上微软宣布将会在各个版本的Visual Studio中免费提供Xama ...

  8. 使用wireshark出现Couldn&&num;39&semi;t run &sol;usr&sol;bin&sol;dumpcap in child process&colon; Permission denied解决办法

    sudo apt-get install libcap2-bin wireshark sudo chgrp myusername /usr/bin/dumpcap # myusername是你使用wi ...

  9. Xamarin Android SDK无法更新的解决办法

    Xamarin Android SDK无法更新的解决办法   Xamarin Android SDK无法更新的解决办法,更新时候,提示警告信息:A folder failed to be moved. ...

  10. &period;NET错误提示之:无法更新EntitySet&OpenCurlyDoubleQuote;TableName”因为它有一个DefiningQuery

    使用LINQ 进行提交数据时发生的错误提示 原因:提交的对象表 没有设主键.