hdu2295DLX重复覆盖+二分
题目是说 给了n个城市 m个雷达 你只能选择其中的k个雷达进行使用 你可以设置每个雷达的半径,最后使得所有城市都被覆盖,要求雷达的半径尽可能的小(所有雷达的半径是一样的)
二分最小半径,然后每次重新建立这个十字链表,跑dlx
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;
const int maxnode=;
const int maxm=;
int K;
struct DLX
{
int n,m,siz;
int U[maxnode],D[maxnode],R[maxnode],L[maxnode],row[maxnode],
col[maxnode];
int H[maxm],S[maxm];
int anss,ans[maxm];
void init(int n,int m)
{
this->n=n;
this->m=m;
for(int i=; i<=n; i++)
{
S[i]=;
U[i]=D[i]=i;
L[i]=i-;
R[i]=i+;
}
R[n]=; L[]=n;
siz=n+;
for(int i=; i<=m; i++)
H[i]=-;
}
void Link(int r, int c)
{
row[siz]=r;
col[siz]=c;
S[c]++;
D[siz]=c;
U[siz]=U[c];
D[U[siz]]=siz;
U[D[siz]]=siz;
if(H[r]<)
{
H[r]=L[siz]=R[siz]=siz;
}
else
{
L[siz]=H[r];
R[siz]=R[H[r]];
R[L[siz]]=siz;
L[R[siz]]=siz;
H[r]=siz;
}
siz++;
}
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]]=R[L[i]]=i;
}
bool v[maxnode];
int AX()
{
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 Dance(int d)
{
if(d+AX()>K)return false;
if(R[]==)return d<=K;
int c=R[];
for(int i=R[]; i!=; i=R[i])
if(S[i]<S[c])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(Dance(d+))return true;
for(int j=L[i]; j!=i; j=L[j])resume(j);
resume(i);
}
return false;
}
}g;
const double eps=1e-;
struct Point{
int x,y;
void input()
{
scanf("%d%d",&x,&y);
}
}city[maxm],station[maxm];
double dis(Point a, Point b)
{
return sqrt((double)(a.x-b.x)*(a.x-b.x)+(double)(a.y-b.y)*(a.y-b.y));
}
int main()
{
int T;
int n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&K);
for(int i= ;i<n; i++)city[i].input();
for(int i=; i<m; i++)station[i].input();
double l=,r=1e8;
while(r-l>=eps)
{
double mid=(l+r)/;
g.init(n,m);
for(int i=; i<m; i++)
for(int j=; j<n; j++)
if(dis(station[i],city[j])<mid-eps)
g.Link(i+,j+);
if(g.Dance())r=mid-eps;
else l=mid+eps;
}
printf("%.6lf\n",l);
}
return ;
}
hdu2295DLX重复覆盖+二分的更多相关文章
- HDU5046 Airport dancing links 重复覆盖+二分
这一道题和HDU2295是一样 是一个dancing links重复覆盖解决最小支配集的问题 在给定长度下求一个最小支配集,只要小于k就行 然后就是二分答案,每次求最小支配集 只不过HDU2295是浮 ...
- hdu3656Fire station(DLX重复覆盖 + 二分)
题目请戳这里 题目大意:一个城市n个点,现在要建m个消防站,消防站建在给定的n个点中.求建m个消防站后,m个消防站要覆盖所有的n个点的覆盖半径最小. 题目分析:重复覆盖问题,DLX解决.不过要求覆盖半 ...
- hdu5046(重复覆盖+二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:要在n个城市里建造不超过k个机场覆盖所有城市,问机场城市之间最大距离最小为多少. 分析:二 ...
- hdu2295(重复覆盖+二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2295 题意::一个国家有n个城市,有m个地方可以建造雷达,最多可以建K个雷达(K>=1 & ...
- hdu 2295 dlx重复覆盖+二分答案
题目大意: 有一堆雷达工作站,安放至多k个人在这些工作站中,找到一个最小的雷达监控半径可以使k个工作人所在的雷达工作站覆盖所有城市 二分半径的答案,每次利用dlx的重复覆盖来判断这个答案是否正确 #i ...
- (中等) HDU 5046 Airport ,DLX+可重复覆盖+二分。
Description The country of jiuye composed by N cites. Each city can be viewed as a point in a two- d ...
- (中等) HDU 2295 , DLX+重复覆盖+二分。
Description N cities of the Java Kingdom need to be covered by radars for being in a state of war. S ...
- hdu5064 DLX可重复覆盖+二分
这题题意是 给了n个城市 在其中小于等于k个城市建立机场然后 使得最远的那个离机场的城市距离最短 二分答案 ,我们对于每次的mid 重新建图然后再来一次DLX,每个点可以覆盖的点建立一条联系就ok了 ...
- hdu 2295 Radar 重复覆盖+二分
题目链接 给m个雷达, n个城市, 以及每个城市的坐标, m个雷达里只能使用k个, 在k个雷达包围所有城市的前提下, 求最小半径. 先求出每个雷达到所有城市的距离, 然后二分半径, 如果距离小于二分的 ...
随机推荐
- monitor
// ==UserScript== // @name Page Monitor // @namespace http://tampermonkey.net/ // @version 0.1 // @d ...
- python中的一些用法总结
用python写了一个测试Demo,其中涉及到一些常用的用法,现在记录在这里,方便后续查阅: 1 python中全局变量的使用: 引用全局变量,不需要golbal声明,修改全局变量,需要使用globa ...
- 用Eclipse构建Maven项目
Eclipse中m2eclipse插件的安装 Help>Install New Software Click Add Name: m2e Location: http://download.ec ...
- mysql \c 终止 mysql输入语句模式
\c 遇到这种情况怎么退出mysql 输入语句模式? mysql> select -> 输入\c退出 mysql> select -> \c mysql> 另外一种情况 ...
- Always On 集群监听创建失败问题
创建SQL Server Always On监听失败如下 需要增加:1.登陆服务器的域账号创建计算机对象的权限,2.集群名称账号在域环境中创建计算机对象的权限 如果是重建监听:需要3.先删除原先的监听 ...
- shell脚本循环和信号
条件判断 if 条件1:then COMMAND elif 条件2:then COMMAND else COMMAND(:) : 表示pass 不执行任何命令 fi 读取用 ...
- ASP.NET学习笔记(1)
1.ASP.Net简介 A.ASP.Net动态网页技术.在服务器端运行.Net代码,动态生成HTML.在浏览器可以使用JavaScript.Dom完成前台工作.如存储数据.访问数据库.业务逻辑运算等可 ...
- MYSQL PROCEDURE 测试用例
/** * 查询俱协信息 */ DROP PROCEDURE IF EXISTS `get_club_list`; DELIMITER $$ CREATE PROCEDURE `get_club_li ...
- git flow常用命令
https://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html https://blog.csdn.net/shu580231/ ...
- 一、程序设计与C语言
@程序:用特殊的编程语言编写的代码,用于表达如何解决问题. @编程语言的作用:编程语言不是用来和计算机交谈的,而是用它来描述要求计算机如何解决问的过程或方法.计算机只能执行(懂得)机器语言. @辗转相 ...