HDU 5046 Airport(dlx)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5046
题意:n个城市修建m个机场,使得每个城市到最近进场的最大值最小。
思路:二分+dlx搜索判定。
#include <iostream> #include <map> #include <string> #include <stdio.h> #include <vector> #include <set> #include <algorithm> #include <string.h> #include <fstream> #include <tchar.h> #include <sstream> using namespace std; ]; int KK; int m; class CDancingLinks { protected: struct DancingLinksNode { DancingLinksNode* left; DancingLinksNode* right; DancingLinksNode* down; DancingLinksNode* up; int col; int row; }; typedef DancingLinksNode Node; int *m_columnEleNumbers; int m_colNumber; int m_rowNumber; Node* m_pool; Node** m_head; int m_curUsePoolIndex; void _Remove(Node* cur) { --m_columnEleNumbers[cur->col]; for(Node* p=cur->down;p!=cur;p=p->down) { p->left->right=p->right; p->right->left=p->left; } } void _Resume(Node* cur) { ++m_columnEleNumbers[cur->col]; for(Node* p=cur->up;p!=cur;p=p->up) { p->left->right=p; p->right->left=p; } } int astar() { Node* p=_GetNode(); ++KK; ; for(Node* q=p->left;q!=p;q=q->left) if(KK!=visit[q->col]) { visit[q->col]=KK; ++ans; for(Node* r=q->up;r!=q;r=r->up) for(Node* t=r->left;t!=r;t=t->left) { visit[t->col]=KK; } } return ans; } bool _SearchSolution(const int depth,std::vector<int> &solution) { Node* p=_GetNode(); if(p->left==p) return true; if(depth+astar()>m) return false; ; ; for(Node* q=p->left;q!=p;q=q->left) { if(m_columnEleNumbers[q->col]<Min) { Min=m_columnEleNumbers[q->col]; MinColumnIndex=q->col; } } for(Node* q=_GetNode(MinColumnIndex)->down;q!=_GetNode(MinColumnIndex);q=q->down) { _Remove(q); solution.push_back(q->row); for(Node* rr=q->right;rr!=q;rr=rr->right) _Remove(rr); ,solution)) return true; for(Node* rr=q->left;rr!=q;rr=rr->left) _Resume(rr); solution.pop_back(); _Resume(q); } return false; } Node* _GetNode(int id) { return m_pool+id; } void _ReleaseMemory() { if(m_columnEleNumbers) { delete[] m_columnEleNumbers; m_columnEleNumbers=nullptr; } if(m_pool) { delete[] m_pool; m_pool=nullptr; } if(m_head) { delete[] m_head; m_head=nullptr; } } public: CDancingLinks():m_colNumber(-),m_rowNumber(-), m_columnEleNumbers(nullptr),m_pool(nullptr),m_head(nullptr) {} /*** 列下标为[1,Column] ***/ CDancingLinks(const int Column,const int Row): m_columnEleNumbers(nullptr),m_pool(nullptr),m_head(nullptr) { SetSize(Column,Row); } /*** 列下标为[1,Column] ***/ void SetSize(const int Column,const int Row) { m_colNumber=Column; m_rowNumber=Row; _ReleaseMemory(); m_columnEleNumbers=]; m_pool=)+]; m_head=]; Clear(); } void Clear() { ;i<=m_colNumber;++i) { Node* cur=_GetNode(i); cur->left=((i==m_colNumber)?_GetNode():_GetNode(i+)); cur->right=((==i)?_GetNode(m_colNumber):_GetNode(i-)); m_columnEleNumbers[i]=; cur->up=cur->down=_GetNode(i); cur->col=i; cur->row=; } ;i<=m_rowNumber;++i) m_head[i]=NULL; m_curUsePoolIndex=m_colNumber+; } ~CDancingLinks() { _ReleaseMemory(); } void AddElement(const int row,const int col) { Node* cur=m_pool+(m_curUsePoolIndex++); cur->up=_GetNode(col); cur->down=_GetNode(col)->down; m_pool[col].down->up=cur; m_pool[col].down=cur; if(m_head[row]==NULL) { m_head[row]=cur->left=cur->right=cur; } else { cur->left=m_head[row]->left; cur->right=m_head[row]; m_head[row]->left->right=cur; m_head[row]->left=cur; } ++m_columnEleNumbers[col]; cur->col=col; cur->row=row; } bool GetSolution(std::vector<int> &Solution) { ,Solution); } }; ][]; ][]; int n; ]; CDancingLinks A; inline long long dist(int i,int j) { ]-a[j][]))+abs(a[i][]-a[j][]); } int ok(long long M) { A.Clear(); ;i<=n;i++) ;j<=n;j++) if(dis[i][j]<=M) { A.AddElement(i,j); } vector<int> ans; return A.GetSolution(ans); } long long cal() { A.SetSize(n,n); ; int i,j; ;i<=n;i++) ;j<=n;j++) dis[i][j]=dist(i,j),d[num++]=dis[i][j]; sort(d,d+num); int M=unique(d,d+num)-d; ,high=M-; long long ans=d[high]; while(low<=high) { ; ; ; } return ans; } int main() { int T; scanf("%d",&T); ;i<=T;++i) { scanf("%d%d",&n,&m); ;j<=n;++j) scanf(],&a[j][]); printf("Case #%d: %I64d\n",i,cal()); } }
HDU 5046 Airport(dlx)的更多相关文章
- HDU 5046 Airport(DLX反复覆盖)
HDU 5046 Airport 题目链接 题意:给定一些机场.要求选出K个机场,使得其它机场到其它机场的最大值最小 思路:二分+DLX反复覆盖去推断就可以 代码: #include <cstd ...
- HDU 5046 Airport【DLX重复覆盖】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意: 给定n个城市的坐标,要在城市中建k个飞机场,使城市距离最近的飞机场的最长距离最小,求这 ...
- (中等) 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 ...
- hdu 5046 二分+DLX模板
http://acm.hdu.edu.cn/showproblem.php?pid=5046 n城市建k机场使得,是每个城市最近机场的距离的最大值最小化 二分+DLX 模板题 #include < ...
- HDU 5046 Airport ( Dancing Links 反复覆盖 )
今年上海网络赛的一道题目 , 跟 HDU 2295 如出一辙 . 就是距离的计算一个是欧几里得距离 , 一个是曼哈顿距离 学完DLX感觉这题好水 ,就是一个裸的反复覆盖 注意下别溢出即可了 #incl ...
- hdu 5046 Airport 二分+重复覆盖
题目链接 给n个点, 定义两点之间距离为|x1-x2|+|y1-y2|. 然后要选出k个城市建机场, 每个机场可以覆盖一个半径的距离. 求在选出点数不大于k的情况下, 这个半径距离的最大值. 二分半径 ...
- HDU 3335 Divisibility (DLX)
Divisibility Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- 【HDOJ】5046 Airport
DLX简单题目. /* 5046 */ #include <iostream> #include <string> #include <map> #include ...
- HDU 2295.Radar (DLX重复覆盖)
2分答案+DLX判断可行 不使用的估计函数的可重复覆盖的搜索树将十分庞大 #include <iostream> #include <cstring> #include < ...
随机推荐
- 动态LOV语句、向具有LOV的ITEM赋值时报FRM-40212需要验证错误
网上解决方法: http://www.itpub.net/thread-845812-2-1.html http://blog.csdn.net/rfb0204421/article/details/ ...
- Oracle Savepoint
1.目的: Use the SAVEPOINT statement to identify a point in a transaction to which you can later roll b ...
- CSSの神小结-简单备忘一下(亲测可用)
css 选择器优先级,标签>id>class 权重 id>class>标签 只记录能想到的以免遗忘: 1.字体css可继承 2.表格:表格细线的合并,表格单元格合并,单元格内容 ...
- Arm环境搭建-基于博创科技(CentOS7.0系统安装篇1)
CentOs 7.0安装和基本命令篇 目的:学习基本的linux命令,熟悉linux操作系统,安装linux.(安装过5.5,6.3并不是安装一帆风顺的,多次安装,有个10次多吧,基本会 ...
- android 项目学习随笔十八(三级缓存)
xUtils的BitmapUtils模块用的就是三级缓存,在项目中尽量还是应用BitmapUtils 三级缓存(机制) import com.itheima.zhsh66.R; import andr ...
- java中length,length(),size()的区别
1. java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.2. java中的length()方法是针对字符串String说的,如果想看 ...
- Java汉诺塔算法
汉诺塔问题[又称河内塔]是印度的一个古老的传说. 据传开天辟地之神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把 ...
- Delphi中CoInitialize之探究
CoInitialize(LPVOID),它将以特定参数调用CoInitializeEx,为当前单元初始化COM库,并标记协同模式为单线程模式.参数必须为NULL.这是关于OLE和COM的问题. Co ...
- POSTGRESQL9.5之pg_rman工具
pg_rman是一款专门为postgresql设计的在线备份恢复的工具.其支持在线和基于时间点备份方式,还可以通过创建backup catalog来维护DB cluster备份信息. 看起来好像是模仿 ...
- AR专用汉明码
增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像.视频.3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动. ...