这一道题和HDU2295是一样

是一个dancing links重复覆盖解决最小支配集的问题

在给定长度下求一个最小支配集,只要小于k就行

然后就是二分答案,每次求最小支配集

只不过HDU2295是浮点,这里是整数

我写的一个比较暴力

#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=4e3;
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
{
LL x,y;
}o[];
LL ABS(LL x,LL y)
{
if(x>=y)return x-y;
return y-x;
}
LL dis(point a,point b)
{
return ABS(a.x,b.x)+ABS(a.y,b.y);
}
LL D[N];
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k),m=n;
for(int i=;i<=n;++i)
scanf("%I64d%I64d",&o[i].x,&o[i].y);
int cnt=;
for(int i=;i<=n;++i)
for(int j=i;j<=n;++j)
D[++cnt]=dis(o[i],o[j]);
sort(D+,D++cnt);
cnt=unique(D+,D++cnt)-D-;
int high=cnt,low=,mid;
while(low<high)
{
mid=(low+high)>>;
init();
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
if(dis(o[i],o[j])<=D[mid])
link(i,j);
if(dance())high=mid;
else low=mid+;
}
printf("Case #%d: %I64d\n",++cas,D[low]);
}
return ;
}

然后另一个是离散化的

#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=4e3;
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
{
LL x,y;
}o[];
LL ABS(LL x,LL y)
{
if(x>=y)return x-y;
return y-x;
}
LL dis(point a,point b)
{
return ABS(a.x,b.x)+ABS(a.y,b.y);
}
LL D[N];
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k),m=n;
for(int i=;i<=n;++i)
scanf("%I64d%I64d",&o[i].x,&o[i].y);
int cnt=;
for(int i=;i<=n;++i)
for(int j=i;j<=n;++j)
D[++cnt]=dis(o[i],o[j]);
sort(D+,D++cnt);
cnt=unique(D+,D++cnt)-D-;
int high=cnt,low=,mid;
while(low<high)
{
mid=(low+high)>>;
init();
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
if(dis(o[i],o[j])<=D[mid])
link(i,j);
if(dance())high=mid;
else low=mid+;
}
printf("Case #%d: %I64d\n",++cas,D[low]);
}
return ;
}

HDU5046 Airport dancing links 重复覆盖+二分的更多相关文章

  1. HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )

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

  2. HDU 3335 Divisibility dancing links 重复覆盖

    分析: dlx重复覆盖的巧用,重复覆盖的原理恰好符合本题的筛选方式,即选择一个数后,该数的倍数或约数可以保证在之后的搜索中不会被选择 于是修改一下启发函数,求解最大的重复覆盖即可.   其实不一定不被 ...

  3. HDU 2295 Radar dancing links 重复覆盖

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

  4. HDU 5046 Airport ( Dancing Links 反复覆盖 )

    今年上海网络赛的一道题目 , 跟 HDU 2295 如出一辙 . 就是距离的计算一个是欧几里得距离 , 一个是曼哈顿距离 学完DLX感觉这题好水 ,就是一个裸的反复覆盖 注意下别溢出即可了 #incl ...

  5. FZU1686 神龙的难题 dancing links 重复覆盖

    分析:每次可以打一个小矩阵的怪,然后把每个怪看成一列,然后每个小矩阵看成一行,枚举左上角就行 注:然后注意总共的节点数是新图的行*列的个数,不是原图 #include<cstdio> #i ...

  6. hdu5046(重复覆盖+二分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:要在n个城市里建造不超过k个机场覆盖所有城市,问机场城市之间最大距离最小为多少. 分析:二 ...

  7. hdu3656Fire station(DLX重复覆盖 + 二分)

    题目请戳这里 题目大意:一个城市n个点,现在要建m个消防站,消防站建在给定的n个点中.求建m个消防站后,m个消防站要覆盖所有的n个点的覆盖半径最小. 题目分析:重复覆盖问题,DLX解决.不过要求覆盖半 ...

  8. 【转】Dancing Links精确覆盖问题

    原文链接:http://sqybi.com/works/dlxcn/ (只转载过来一部分,全文请看原文,感觉讲得很好~)正文    精确覆盖问题    解决精确覆盖问题    舞蹈步骤    效率分析 ...

  9. hihoCoder #1321 : 搜索五•数独 (Dancing Links ,精确覆盖)

    hiho一下第102周的题目. 原题地址:http://hihocoder.com/problemset/problem/1321 题意:输入一个9*9数独矩阵,0表示没填的空位,输出这个数独的答案. ...

随机推荐

  1. Any Way You Slice It (向量旋转 以及 判断线段是否相交)(模板)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11353 #include<iostream> # ...

  2. 常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript

    常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript Javascript现阶段还不适合用来做独立开发,它的天下还是在web应用 ...

  3. Visual Studio 2013 之 Productivity Power Tools

    http://blogs.msdn.com/b/visualstudio_cn/archive/2014/02/20/visual-studio-2013-productivity-power-too ...

  4. uva 10069

    简单的dp 但是一个大数加法  套用了末位大牛的类模板 #include <cstdio> #include <cstring> #include <algorithm& ...

  5. hbase 使用备忘

    hbase是基于hadoop的,所以hbase服务器必须启动hadoop,这点很重要. 当然hbase其实只用到了dadoop的一个组件 1. 启动hadoop-dfs 在主上执行如下命令,可以把主和 ...

  6. Get请求携带数据量的各种限制及解决办法、Post请求说明

    1.   Get请求携带数据量的各种限制及解决办法 Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制.这个限制是特定的浏览器及服务器对它的限制. 到新公司处理 ...

  7. Servlet课程0425(七) 到数据库中去验证用户,同时防止SQL注入漏洞

    Login.java //登录界面 package com.tsinghua; import javax.servlet.http.*; import java.io.*; public class ...

  8. iOS 10 使用相机及相簿闪退的问题修正

    http://www.cnblogs.com/onechen/p/5935579.html

  9. AC题目简解-dp

    dp类:A - Bridging signals ZOJ 3627 POJ1631 HDU1950给出一个从1-n的数字排列,求最长上升子序列长度.直接说解法吧.新开一个数组d,d[i]表示的是能构成 ...

  10. HDU1535——Invitation Cards(最短路径:SPAF算法+dijkstra算法)

    Invitation Cards DescriptionIn the age of television, not many people attend theater performances. A ...