http://acm.hdu.edu.cn/showproblem.php?pid=5046

n城市建k机场使得,是每个城市最近机场的距离的最大值最小化

二分+DLX

模板题

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,0,sizeof(x))
typedef long long LL;
const int
INF=1000000005;
const int
N=4444;
int
m;
struct
node
{
int
L[N],R[N],D[N],U[N],e;
int
col[N];
int
H[N],num[N]; int visit[N],KK; void init(int n)
{

KK=0;
int
i;
for(
i=0;i<=n;i++)
{
if(
i==n) L[i]=0;
else
L[i]=i+1;
if(
i==0) R[i]=n;
else
R[i]=i-1; num[i]=0; H[i]=-1;
D[i]=U[i]=i;
}

e=n+1;
}
void
add(int r,int c)
{

U[e]=c;
D[e]=D[c];
U[D[c]]=e;
D[c]=e;
if(
H[r]<0) H[r]=L[e]=R[e]=e;
else
{

L[e]=L[H[r]];
R[e]=H[r];
R[L[H[r]]]=e;
L[H[r]]=e;
}

num[c]++;
col[e]=c;
e++;
} void
remove(int c)
{
int
i;
for(
i=D[c];i!=c;i=D[i])
{

R[L[i]]=R[i];
L[R[i]]=L[i];
}
} void
resume(int c)
{
int
i;
for(
i=U[c];i!=c;i=U[i])
{

L[R[i]]=R[L[i]]=i;
}
} int
astar()
{

KK++;
int
ans=0,i,j,k;
for(
i=L[0];i!=0;i=L[i]) if(KK!=visit[i])
{

visit[i]=KK;
ans++;
for(
j=D[i];j!=i;j=D[j]) for(k=L[j];k!=j;k=L[k])
{

visit[col[k]]=KK;
}
}
return
ans;
} int
DFS(int cnt)
{
if(
L[0]==0) return 1;
if(
cnt+astar()>m) return 0; int tmp=INF,c,i;
for(
i=L[0];i!=0;i=L[i]) if(num[col[i]]<tmp)
{

tmp=num[col[i]];
c=i;
}
for(
i=D[c];i!=c;i=D[i])
{

remove(i);
int
j;
for(
j=L[i];j!=i;j=L[j]) remove(j);
if(
DFS(cnt+1)) return 1; for(j=R[i];j!=i;j=R[j]) resume(j);
resume(i);
}
return
0;
}
}
A;
int
n;
LL s[65][65];
LL le[10005];
struct
point{
LL x,y;
}
p[65];
int
ok(LL M)
{

A.init(n);
int
i,j;
for(
i=1;i<=n;i++)
for(
j=1;j<=n;j++)
if(
s[i][j]<=M)
A.add(i,j);
return
A.DFS(0);
} int main(){
int
_,cas = 1;
RD(_);
while(
_--){
RD2(n,m);
for(int
i = 1;i <= n;++i){
scanf("%I64d%I64d",&p[i].x,&p[i].y);
}
int
mm = 0;
for(int
i = 1;i <= n;++i){
for(int
j = 1;j <= n;++j){
LL len = abs(p[i].x - p[j].x) + abs(p[i].y - p[j].y);
s[i][j] = s[j][i] = len;
le[mm++] = len;
}
}

sort(le,le+mm);
mm = unique(le,le+mm)-le;
int
l = 0,r = mm - 1;
LL ans = 0;
while(
l <= r){
LL mid = (l + r)>>1;
if(
ok(le[mid]))
ans = le[mid],r = mid - 1;
else
l = mid + 1;
}

printf("Case #%d: ",cas++);
cout<<ans<<endl;
}
return
0;
}

hdu 5046 二分+DLX模板的更多相关文章

  1. HDU 5046 Airport(dlx)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:n个城市修建m个机场,使得每个城市到最近进场的最大值最小. 思路:二分+dlx搜索判定. ...

  2. HDU 3656 二分+dlx判定

    Fire station Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  3. HDU 5046 Airport(DLX反复覆盖)

    HDU 5046 Airport 题目链接 题意:给定一些机场.要求选出K个机场,使得其它机场到其它机场的最大值最小 思路:二分+DLX反复覆盖去推断就可以 代码: #include <cstd ...

  4. hdu 4024 二分

    转自:http://www.cnblogs.com/kuangbin/archive/2012/08/23/2653003.html   一种是直接根据公式计算的,另外一种是二分算出来的.两种方法速度 ...

  5. poj 3740 Easy Finding 二进制压缩枚举dfs 与 DLX模板详细解析

    题目链接:http://poj.org/problem?id=3740 题意: 是否从0,1矩阵中选出若干行,使得新的矩阵每一列有且仅有一个1? 原矩阵N*M $ 1<= N <= 16 ...

  6. [ACM] POJ 3740 Easy Finding (DLX模板题)

    Easy Finding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16178   Accepted: 4343 Des ...

  7. HDU 5046

    同样是二分+DLX即可. #include <iostream> #include <cstdio> #include <cstring> #include < ...

  8. LeetCode 二分查找模板 I

    模板 #1: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...

  9. (中等) 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 ...

随机推荐

  1. Linux下php5.3.3安装mcrypt扩展

    具体操作: 一.下载软件包 1.下载php(版本要与系统安装的一致) http://pan.baidu.com/s/1mifTbfE 2.下载libmcrypt(安装mcrypt需要此软件包) htt ...

  2. Appuim学习路-Appuim介绍

    (学一个东西,总的知道它支持什么.为什么要选择它吧?所以我就去看github上的介绍了.发现大家介绍的来源大多来自于此)   Appium是一个开源的自动化框架,是跨平台的,允许所有平台使用同一套AP ...

  3. PAT L1-009 N个数求和(模拟分数加法)

    本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(<=100).随后一行按格 ...

  4. 【校招面试 之 C/C++】第20题 C++ STL(二)之Vector

    1.vector的动态增长 当添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间.vector的空 ...

  5. 8-导弹拦截一(n^2 and nlogn)

    /*某国为了防御敌国的导弹袭击,研发出一套导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发拦截炮弹能够到达任意的高度,但是以后每一发拦截炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的多 ...

  6. jxl 创建excel

    public static void performanceExcel(String sCurrPath,List<Record> list, String begin,String en ...

  7. 使用Spring框架来管理模板类

    1. 刚才编写的代码使用的是new的方式,应该把这些类交给Spring框架来管理. 2. 修改的步骤如下 applicationContext.xml中<beans>标签的开头配置为: * ...

  8. MVC FormCollection 无法获取值的问题

     把action定义为[HttpPost],并且ajax.beginform中ajaxoption中定义为Post,在提交表单时就可以获取FormCollection的值了.httpGet或者后台不定 ...

  9. Linux wget命令

    一.简介 wget是一个Linux系统中的下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器.wget支持HTTP,HTTPS ...

  10. PAT 1084 外观数列(20)(代码+思路+推荐测试用例)

    1084 外观数列(20 分) 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 ...