hdu 3656 DLX
思路:二分枚举建边,用DLX判断是否满足。
#include<set>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define clr(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define mp make_pair
#define Maxn 20010
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 100000000
#define lowbit(x) (x&(-x))
#define Mod 1000000007
using namespace std;
int L[Maxn], R[Maxn], U[Maxn], D[Maxn];
int id, ans, S[Maxn], H[Maxn], C[Maxn];
int cnt,n,m;
double dis[][],edge[];
struct Point{
double x,y;
}p[Maxn];
double Dis(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool vis[];
void Link(int r, int c)
{
U[id] = c;
D[id] = D[c];
U[D[c]] = id;
D[c] = id;
if (H[r] < )
H[r] = L[id] = R[id] = id;
else
{
L[id] = H[r];
R[id] = R[H[r]];
L[R[H[r]]] = id;
R[H[r]] = id;
}
S[c]++;
C[id++] = c;
}
void Remove(int c)
{
int i;
for (i = D[c]; i != c; i = D[i])
{
L[R[i]] = L[i];
R[L[i]] = R[i];
}
}
void Resume(int c)
{
int i;
for (i = D[c]; i != c; i = D[i])
L[R[i]] = R[L[i]] = i;
}
int A()
{
int i, j, k, res;
memset(vis, false,sizeof(vis));
for (res = , i = R[]; i; i = R[i])
{
if (!vis[i])
{
res++;
for (j = D[i]; j != i; j = D[j])
{
for (k = R[j]; k != j; k = R[k]){
vis[C[k]] = true;
// cout<<i<<" "<<j<<" "<<k<<" "<<C[k]<<endl;
}
}
}
}
return res;
}
bool dfs (int step) {
if (step + A() > m) return false;
if (R[] == ) return true;
int temp = inf, id;
for (int i = R[]; i ; i = R[i]) {
if (S[i] < temp) {
temp = S[i];
id = i;
}
}
for (int i = D[id]; i != id; i = D[i]) {
Remove(i);
for (int j = R[i]; j != i; j = R[j]) {
Remove(j);
}
if (dfs(step + )) {
return true;
}
for (int j = L[i]; j != i; j = L[j]) {
Resume(j);
}
Resume(i);
}
return false;
}
void Init(int m)
{
int i;
for (i = ; i <= m; i++)
{
R[i] = i + ;
L[i + ] = i;
U[i] = D[i] = i;
S[i] = ;
}
R[m] = ;
id = m + ;
}
void build(int pos)
{
int i,j;
Init(n);
for(i=;i<=n;i++){
H[i]=-;
for(j=;j<=n;j++){
if(dis[i][j]<=edge[pos])
Link(i,j);
}
}
}
void solve()
{
int i,j;
int l,r,mid;
l=,r=cnt;
while(l<r){
mid=(l+r)>>;
build(mid);
if(dfs())
r=mid;
else
l=mid+;
}
printf("%.6lf\n",edge[l]);
}
int main()
{
int i,j,t;
//freopen("ttt.txt","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(i=;i<=n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
cnt=;
for(i=;i<=n;i++){
for(j=i+;j<=n;j++){
dis[i][j]=dis[j][i]=Dis(p[i],p[j]);
edge[++cnt]=dis[i][j];
}
dis[i][i]=;
}
edge[++cnt]=;
sort(edge+,edge++cnt);
int num=;
for(i=;i<=cnt;i++){
if(edge[i]!=edge[num]){
edge[++num]=edge[i];
}
}
cnt=num;
solve();
}
return ;
}
hdu 3656 DLX的更多相关文章
- [DLX反复覆盖] hdu 3656 Fire station
题意: N个点.再点上建M个消防站. 问消防站到每一个点的最大距离的最小是多少. 思路: DLX直接二分推断TLE了. 这时候一个非常巧妙的思路 我们求的距离一定是两个点之间的距离 因此我们把距离都求 ...
- HDU 3656 二分+dlx判定
Fire station Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- HDU 3909 DLX
http://blog.csdn.net/sr_19930829/article/details/39756513 http://www.kuangbin.net/archives/hdu4069-d ...
- hdu 3111 DLX解数独
思路:裸的DLX解数独.关键是建图,感觉还不如写个dfs直接,DLX写这个的代码很烦. #include<set> #include<map> #include<cmat ...
- hdu 2295 DLX
思路:裸的DLX重复覆盖 #include<set> #include<cmath> #include<queue> #include<cstdio> ...
- HDU 2828 DLX搜索
Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- (中等) HDU 3335 , DLX+重复覆盖。
Description As we know,the fzu AekdyCoin is famous of math,especially in the field of number theory. ...
- (中等) HDU 2295 , DLX+重复覆盖+二分。
Description N cities of the Java Kingdom need to be covered by radars for being in a state of war. S ...
- hdu 2295 dlx重复覆盖+二分答案
题目大意: 有一堆雷达工作站,安放至多k个人在这些工作站中,找到一个最小的雷达监控半径可以使k个工作人所在的雷达工作站覆盖所有城市 二分半径的答案,每次利用dlx的重复覆盖来判断这个答案是否正确 #i ...
随机推荐
- Vagrant 快速入门
1. Vagrant功能: Vagrant uses Oracle’s VirtualBox to build configurable, lightweight, and portable virt ...
- win7和linux下的文件共享
在vmware虚拟机下安装linux系统,如果自个电脑的win7设置成自动获取IP的话,每次使用FTP文件传输服务器都要检查win7和linux系统的IP是否处于同一网段,如果不是还要手动设置.再有一 ...
- winform 在指定目录下已经生成资源Image图片的方式
假设在项目目录下存在一个Image目录,注意其中图片已经都设置成为:生成方式为资源文件. /// <summary> /// 得到要绘置的图片对像 /// </summary> ...
- Java常见排序算法之折半插入排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 在linux下修改oracle的sys和system的密码和用户解锁
修改oracle的sys和system的密码和用户解锁 1.再linux系统上sqlplus '/as sysdba' 进入sqlplus后就可以修改sys和system的密码了 2.alter us ...
- 什么是双线双IP,什么叫双线双IP
双线双IP实现双线路,拥有中国电信.中国网通骨干网的接入,在该机房托管的服务器,实现了电信和网通的双线路接入,使电信和网通的用户都能以非常快的速度连接到服务器,解决了电信和网通互相访问速度慢的问题.这 ...
- 「译」JavaScript 的怪癖 1:隐式类型转换
原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...
- Codeforce Gym 100015I Identity Checker 暴力
Identity Checker 题目连接: http://codeforces.com/gym/100015/attachments Description You likely have seen ...
- cdoj 15 Kastenlauf dfs
Kastenlauf Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/3 De ...
- 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因
声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...