HDU 2295 Radar dancing links 重复覆盖
就是dancing links 求最小支配集,重复覆盖
精确覆盖时:每次缓存数据的时候,既删除行又删除列(这里的删除列,只是删除表头)
重复覆盖的时候:只删除列,因为可以重复覆盖
然后重复覆盖有一个估价函数,这个函数很强大,可以进行强力剪枝
这个估价函数的意思是,搜索到当前时,至少还需要删除几行,就可以完全覆盖了
这个至少得意思是最优删:
选择一列,假设覆盖这一列的有许多行,假设这些行覆盖的所有列都是一行覆盖的,然后记录数量
然后重复操作,直到全部覆盖,所以这个数量就是最少要的数量
(估价函数很重要)
#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=;
const double eps=1e-;
int n,m,sz,k;
int u[N],l[N],r[N],d[N];
int h[],s[],col[N];
void init()
{
for(int i=; i<=m; ++i)
{
s[i]=;
u[i]=d[i]=i;
l[i]=i-;
r[i]=i+;
}
r[m]=;
l[]=m;
sz=m;
for(int i=; i<=n; ++i)
h[i]=-;
}
void link(int x,int y)
{
++sz;
++s[y],col[sz]=y;
u[sz]=u[y],d[u[y]]=sz;
d[sz]=y,u[y]=sz;
if(h[x]==-)h[x]=l[sz]=r[sz]=sz;
{
l[sz]=l[h[x]];
r[l[h[x]]]=sz;
r[sz]=h[x];
l[h[x]]=sz;
}
}
void del(int y)
{
for(int i=d[y]; i!=y; i=d[i])
r[l[i]]=r[i],l[r[i]]=l[i];
}
void resume(int y)
{
for(int i=d[y]; i!=y; i=d[i])
r[l[i]]=l[r[i]]=i;
}
bool vis[];
int f()
{
int ret=;
for(int i=r[]; i; i=r[i])
vis[i]=;
for(int i=r[]; i; i=r[i])
{
if(vis[i])continue;
vis[i]=;
++ret;
for(int j=d[i]; j!=i; j=d[j])
for(int k=r[j]; k!=j; k=r[k])
vis[col[k]]=;
}
return ret;
}
bool dance(int pos)
{
if(pos+f()>k)return ;
if(!r[])
{
if(pos<=k)return ;
return ;
}
int t=r[];
for(int i=r[]; i!=; i=r[i])
if(s[i]<s[t])t=i;
for(int i=d[t]; i!=t; i=d[i])
{
del(i);
for(int j=r[i]; j!=i; j=r[j])
del(j);
if(dance(pos+))return ;
for(int j=l[i]; j!=i; j=l[j])
resume(j);
resume(i);
}
return ;
}
struct Point
{
double x,y;
}b[],e[];
double dis(int i,int j)
{
return sqrt((b[i].x-e[j].x)*(b[i].x-e[j].x)+(b[i].y-e[j].y)*(b[i].y-e[j].y));
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
swap(n,m);
for(int i=;i<=m;++i)
scanf("%lf%lf",&e[i].x,&e[i].y);
for(int i=;i<=n;++i)
scanf("%lf%lf",&b[i].x,&b[i].y);
double low=,high=1e6;
while(high-low>=eps)
{
double mid=(high+low)/2.0;
init();
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if(dis(i,j)<=mid)
link(i,j);
if(dance())high=mid;
else low=mid;
}
low=(high+low)/;
printf("%.6f\n",low);
}
return ;
}
HDU 2295 Radar dancing links 重复覆盖的更多相关文章
- HDU 3335 Divisibility dancing links 重复覆盖
分析: dlx重复覆盖的巧用,重复覆盖的原理恰好符合本题的筛选方式,即选择一个数后,该数的倍数或约数可以保证在之后的搜索中不会被选择 于是修改一下启发函数,求解最大的重复覆盖即可. 其实不一定不被 ...
- [ACM] HDU 2295 Radar (二分法+DLX 重复覆盖)
Radar Problem Description N cities of the Java Kingdom need to be covered by radars for being in a s ...
- HDU5046 Airport dancing links 重复覆盖+二分
这一道题和HDU2295是一样 是一个dancing links重复覆盖解决最小支配集的问题 在给定长度下求一个最小支配集,只要小于k就行 然后就是二分答案,每次求最小支配集 只不过HDU2295是浮 ...
- HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )
以下转自 这里 : 最小支配集问题:二分枚举最小距离,判断可行性.可行性即重复覆盖模型,DLX解之. A*的启发函数: 对当前矩阵来说,选择一个未被控制的列,很明显该列最少需要1个行来控制,所以ans ...
- HDU 5046 Airport ( Dancing Links 反复覆盖 )
今年上海网络赛的一道题目 , 跟 HDU 2295 如出一辙 . 就是距离的计算一个是欧几里得距离 , 一个是曼哈顿距离 学完DLX感觉这题好水 ,就是一个裸的反复覆盖 注意下别溢出即可了 #incl ...
- HDU 3111 Sudoku ( Dancing Links 精确覆盖模型 )
推荐两篇学DLX的博文: http://bbs.9ria.com/thread-130295-1-1.html(这篇对DLX的工作过程演示的很详细) http://yzmduncan.iteye.co ...
- FZU1686 神龙的难题 dancing links 重复覆盖
分析:每次可以打一个小矩阵的怪,然后把每个怪看成一列,然后每个小矩阵看成一行,枚举左上角就行 注:然后注意总共的节点数是新图的行*列的个数,不是原图 #include<cstdio> #i ...
- HDU 2295 Radar (重复覆盖)
Radar Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU2295 Radar —— Dancing Links 可重复覆盖
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2295 Radar Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- HTMLParser获取属性名
HTMLParser获取属性名方式: 原始网页文本: <a title="美军被曝虐尸" href="http://www.sogou.com/web?query= ...
- Solr + Hadoop = Big Data Love
FROM:http://architects.dzone.com/articles/solr-hadoop-big-data-love 许多人使用Hadoop的开源项目来处理大数据的大数据集,因为它是 ...
- Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- obj转换成数组
原则上obj是不能转换成数组的.首先array也是obj.只是一个特殊的object. obj一个很关键的点,是拥有成员和方法,撇开方法不说,obj就是一个key-value结构.也就是哈希数组,而j ...
- What are the advantages of logistic regression over decision trees?FAQ
What are the advantages of logistic regression over decision trees?FAQ The answer to "Should I ...
- PAT-乙级-1014. 福尔摩斯的约会 (20)
1014. 福尔摩斯的约会 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大侦探福尔摩斯接到一张奇怪的 ...
- uva 10940
数学 打了个表 找一下规律.... #include <cstdio> int a[30]; void init() { a[1]=2;a[2]=4;a[3]=8;a[4]=16;a[5] ...
- ubuntu 和 win7 远程登陆 + vnc登陆
ubuntu 和 win7 远程登陆: 第一种(通过win7自带的远程桌面来连接ubuntu) 1. windows7配置 我的电脑->属性->远程设置.-----允许远程连接 2. ub ...
- PreparedStatement是如何大幅度提高性能的
本文讲述了如何正确的使用prepared statements.为什么它可以让你的应用程序运行的更快,和同样的让数据库操作变的更快. 为什么Prepared Statements非常重要?如何正确的 ...
- JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源
一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar