曼哈顿距离MST
https://www.cnblogs.com/xzxl/p/7237246.html
讲的不错
/*
曼哈顿距离最小生成树 poj 3241 Object Clustering
按照上面的假设我们先考虑y周顺时针45°的情况
dis(i,j)=x[j]-x[i]+y[j]-y[i]=x[j]+y[j]-(x[i]+x[j])
dis取决于x[j]+y[j] 所以排序的关键字就是x+y
然后我们按y-x离散化 然后维护 y-x大于当前点 的点中
x+y最小的点 时间复杂度NlogN
最大生成树的话 不具有对称性 需要往8个方向都搞一遍
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 100010
using namespace std;
int n,k,m,num,s[maxn],vl[maxn],idex[maxn],a[maxn],b[maxn],fa[maxn];
struct node{
int x,y,id;
}poi[maxn];
struct edge{
int u,v,t;
}e[maxn*];
int cmp1(const node &A,const node &B){
if(A.x==B.x)return A.y<B.y;
return A.x<B.x;
}
int cmp2(const edge &A,const edge &B){
return A.t<B.t;
}
void Add(int u,int v,int t){
num++;e[num].u=u;
e[num].v=v;e[num].t=t;
}
int Abs(int x){
return x>?x:-x;
}
int Cal(int i,int j){
return Abs(poi[i].x-poi[j].x)+Abs(poi[i].y-poi[j].y);
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void Insert(int pos,int val,int id){
while(pos){
if(vl[pos]>val){
vl[pos]=val;idex[pos]=id;
}
pos-=(pos&-pos);
}
}
int Query(int pos){
int res=-,mx=1e9+;
while(pos<=n){
if(mx>vl[pos]){
mx=vl[pos];res=idex[pos];
}
pos+=(pos&-pos);
}
return res;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%d%d",&poi[i].x,&poi[i].y);
poi[i].id=i;
}
for(int K=;K<=;K++){
memset(vl,/,sizeof(vl));
memset(idex,-,sizeof(idex));
if(K==||K==)
for(int i=;i<=n;i++)
swap(poi[i].x,poi[i].y);
else if(K==)
for(int i=;i<=n;i++)
poi[i].x=-poi[i].x;
sort(poi+,poi++n,cmp1);
for(int i=;i<=n;i++)// 按照y-x进行离散化
a[i]=b[i]=poi[i].y-poi[i].x;
sort(b+,b++n);
m=unique(b+,b++n)-b-;
for(int i=n;i>=;i--){
int pos=lower_bound(b+,b++m,a[i])-b;
int res=Query(pos);
if(res!=-)
Add(poi[i].id,poi[res].id,Cal(i,res));
Insert(pos,poi[i].x+poi[i].y,i);
}
}
sort(e+,e++num,cmp2);
for(int i=;i<=n;i++)fa[i]=i;
int cnt=n-k;
for(int i=;i<=num;i++){
if(find(e[i].u)==find(e[i].v))continue;
fa[find(e[i].u)]=find(e[i].v);
cnt--;if(cnt==){
printf("%d\n",e[i].t);break;
}
}
return ;
}
曼哈顿距离MST的更多相关文章
- [HDU 4666]Hyperspace[最远曼哈顿距离][STL]
题意: 许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果. 思路: 用"疑似绝对值"的思想, 维护每种状态 ...
- HDU 4666 Hyperspace (最远曼哈顿距离)
Hyperspace Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- HDU 4666 Hyperspace (2013多校7 1001题 最远曼哈顿距离)
Hyperspace Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604 题意: 平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9) ...
- Hdu4311 || 4312Meeting point-1/-2 n个点中任意选一个点使得其余点到该点曼哈顿距离之和最小
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离
Atitti knn实现的具体四个距离算法 欧氏距离.余弦距离.汉明距离.曼哈顿距离 1. Knn算法实质就是相似度的关系1 1.1. 文本相似度计算在信息检索.数据挖掘.机器翻译.文档复制检测等领 ...
- 【POJ 3241】Object Clustering 曼哈顿距离最小生成树
http://poj.org/problem?id=3241 曼哈顿距离最小生成树模板题. 核心思想是把坐标系转3次,以及以横坐标为第一关键字,纵坐标为第二关键字排序后,从后往前扫.扫完一个点就把它插 ...
- 【HDU 4311】Meeting point-1(前缀和求曼哈顿距离和)
题目链接 正经解法: 给定n个点的坐标,找一个点,到其他点的曼哈顿距离之和最小.n可以是100000.大概要一个O(nlogn)的算法.算曼哈顿距离可以把x和y分开计算排好序后计算前缀和就可以在O(1 ...
- hdu4666 Hyperspace ——曼哈顿距离
link:http://acm.hdu.edu.cn/showproblem.php?pid=4666 这题学会了怎么处理曼哈顿距离. 比如维数是k,那么每个点有2^k个状态,求出在每个状态下,所有点 ...
随机推荐
- 6.11---swagger文件上传的写法【照着写就行了,主要是需要声明contentType未mutilpart---如果不设置这个,就无法识别文件的】
MultipartFile 是直接接收前台传过来的文件,File是抽象出来的文件对象,用来表示文件,一般操作都是操作的File,所以需要将MultipartFile转为File controller写 ...
- tp5.0分页样式调控
基础的分页调用 /** * 控制器部分代码 */ //实例化模型 $areasModel=new Areas(); //分页数据集 $listarea=$areasModel->paginate ...
- (转)Vuex简单入门
今天试了一下Vuex,感觉跟Redux的实现思想类似.再此,简单地总结一下. 什么是Vuex 在Vue中,多组件的开发给我们带来了很多的方便,但同时当项目规模变大的时候,多个组件间的数据通信和状态管理 ...
- html5——2D转换
transform 属性 1.向元素应用 2D 或 3D 转换 2.该属性允许我们对元素进行旋转.缩放.移动或倾斜. 缩放与位移 transform: scale(, 0.5);//水平缩放,垂直缩放 ...
- html5——过渡
transition:1.开始状态 2.终止状态 3.过渡属性 transition: width 2s, background-color 2s;//属性,时间 transition: a ...
- jsessionid什么时候生成并传递到前端的?
jsessionid什么时候生成并传递到前端的? 如果客户端请求的cookie中不包含JSESSIONID,服务端调用request.getSession()时就会生成并传递给客户端,此次响应 ...
- UITableview 兼容IOS6 和IOS7的方法
1. TableVIew向下拉44像素 添加Auto layout 2. Extended edge 选择Under top bars 2. 在Viewdidload中添加代码 if ([[UIDe ...
- CDR如何使用钢笔工具进行完美抠图?【6·18特惠倒计时!】
不要以为抠图只能在图像处理软件中实现,矢量图形绘制软件CorelDRAW一样可以,而且方法很多,文章介绍使用CDR钢笔工具抠图的方法. 提示说明: 首先说明一下,CDR中的钢笔工具和其他平面设计软件中 ...
- Weex框架源码分析(Android)(一)
一.weexSDK初始化流程 WXSDKEngine.initialize(Application application,InitConfig config); //WXSDKEngine的init ...
- 前端自动化构建工具gulp使用
1. 全局安装 gulp: $ npm install --global gulp 2. 作为项目的开发依赖(devDependencies)安装: $ npm install --save-dev ...