hdu 5046 二分+DLX模板
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模板的更多相关文章
- HDU 5046 Airport(dlx)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:n个城市修建m个机场,使得每个城市到最近进场的最大值最小. 思路:二分+dlx搜索判定. ...
- HDU 3656 二分+dlx判定
Fire station Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- HDU 5046 Airport(DLX反复覆盖)
HDU 5046 Airport 题目链接 题意:给定一些机场.要求选出K个机场,使得其它机场到其它机场的最大值最小 思路:二分+DLX反复覆盖去推断就可以 代码: #include <cstd ...
- hdu 4024 二分
转自:http://www.cnblogs.com/kuangbin/archive/2012/08/23/2653003.html 一种是直接根据公式计算的,另外一种是二分算出来的.两种方法速度 ...
- poj 3740 Easy Finding 二进制压缩枚举dfs 与 DLX模板详细解析
题目链接:http://poj.org/problem?id=3740 题意: 是否从0,1矩阵中选出若干行,使得新的矩阵每一列有且仅有一个1? 原矩阵N*M $ 1<= N <= 16 ...
- [ACM] POJ 3740 Easy Finding (DLX模板题)
Easy Finding Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16178 Accepted: 4343 Des ...
- HDU 5046
同样是二分+DLX即可. #include <iostream> #include <cstdio> #include <cstring> #include < ...
- LeetCode 二分查找模板 I
模板 #1: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...
- (中等) 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 ...
随机推荐
- 与servlet相关的接口
(二)与servlet相关的接口 从servlet仅有的5个方法当中,我们知道其涉及3个接口,分别是: ServletConfig ServletRequest ServletResponse 2.1 ...
- System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部
SQL还原时出现下面的错误,System.Data.SqlClient.SqlError: 尚未备份数据库 "***" 的日志尾部.如果该日志包含您不希望丢失的工作,请使用 BAC ...
- https 证书传递、验证和数据加密、解密过程解析
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL ...
- 《Visual C++开发实战1200例 第1卷》扫描版[PDF]
[内容简介:] <Visual C++开发实战1200例(第1卷)>是“软件开发实战1200例”丛书之一.<Visual C++开发实战1200例(第1卷)>,编程实例的四库全 ...
- svn: authentication cancelled
从svn 下程序时用户名和密码输入正确后报如图错误! 控制台输出: svn: authentication cancelled svn: authentication cancelled ...
- C++调试帮助
assert预处理宏 assert是一种预处理宏,所谓预处理其实是一个预处理变量,其行为类似于内联函数,assert宏使用一个表达式作为其条件: assert(expr) 首先是对expr进行求值,如 ...
- codeblocks 更换颜色主题
关闭codeblocks,下载主题文件(colour_themes.conf).在关闭codeblocks的情况下,linux下的~/.config/codeblocks/下有个conf文件,将其备份 ...
- python的select服务端的代码和客户端的代码
服务端的代码 import socket import queue import select ip_bind = ("127.0.0.1",9000) message_queue ...
- jquery-jsonp插件解决跨域问题
用jquery-jsonp插件解决ajax跨域问题,既可以实现ajax同样的请求效果,而且server服务端的相关代码也不用做任何改变. 代码如下: var url="http://loca ...
- Python 安装路径, dist-packages 和 site-packages 区别
Stack Overflow's answer 译: dist-packages is a Debian-specific convention that is also present in its ...