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的更多相关文章

  1. [HDU 4666]Hyperspace[最远曼哈顿距离][STL]

    题意: 许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果. 思路: 用"疑似绝对值"的思想, 维护每种状态 ...

  2. HDU 4666 Hyperspace (最远曼哈顿距离)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  3. HDU 4666 Hyperspace (2013多校7 1001题 最远曼哈顿距离)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  4. BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604 题意: 平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9) ...

  5. Hdu4311 || 4312Meeting point-1/-2 n个点中任意选一个点使得其余点到该点曼哈顿距离之和最小

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  6. Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离

    Atitti knn实现的具体四个距离算法  欧氏距离.余弦距离.汉明距离.曼哈顿距离 1. Knn算法实质就是相似度的关系1 1.1. 文本相似度计算在信息检索.数据挖掘.机器翻译.文档复制检测等领 ...

  7. 【POJ 3241】Object Clustering 曼哈顿距离最小生成树

    http://poj.org/problem?id=3241 曼哈顿距离最小生成树模板题. 核心思想是把坐标系转3次,以及以横坐标为第一关键字,纵坐标为第二关键字排序后,从后往前扫.扫完一个点就把它插 ...

  8. 【HDU 4311】Meeting point-1(前缀和求曼哈顿距离和)

    题目链接 正经解法: 给定n个点的坐标,找一个点,到其他点的曼哈顿距离之和最小.n可以是100000.大概要一个O(nlogn)的算法.算曼哈顿距离可以把x和y分开计算排好序后计算前缀和就可以在O(1 ...

  9. hdu4666 Hyperspace ——曼哈顿距离

    link:http://acm.hdu.edu.cn/showproblem.php?pid=4666 这题学会了怎么处理曼哈顿距离. 比如维数是k,那么每个点有2^k个状态,求出在每个状态下,所有点 ...

随机推荐

  1. 记Spring下autowire为name时的一个现象

    当autowire为byname时,假如有一个名为“user”的component,恰巧还有另一个属性为“user”,它的set方法为setUser(User user),Spring会强行把comp ...

  2. Laravel5.1学习笔记16 数据库2 查询构造器(这个不用看,不如用EloquentORM)

    Introduction Retrieving Results Aggregates Selects Joins Unions Where Clauses Advanced Where Clauses ...

  3. SQL Server2008 数据库日志清理

    USE [master] --运行master数据库 GO ALTER DATABASE HIS_MHYW SET RECOVERY SIMPLE WITH NO_WAIT --库 (dh_emr) ...

  4. jdbc 使用谨记

    jdbc是java操作数据库的杀手锏.所有java程序员,对jdbc应该都不陌生. 但是,应该你也曾经被其折磨的抓耳挠腮,咬牙切齿吧,也许正因为这样你才对其记忆犹新,刻骨铭心. 这里有一些使用jdbc ...

  5. Hibernate自动事务揪出的编码不规范

    最近重构的项目(Java初学中),Service层一个获取通知记录报错: org.springframework.dao.InvalidDataAccessResourceUsageException ...

  6. RPU4+1视图(转)

    4+1视图模型概况 Kruchten 提出了一个"4+1"视图模型,从5个不同的视角包括包括逻辑试图.进程视图.物理视图.开发视图.场景视图来描述软件体系结构.每一个视图只关心系统 ...

  7. 【sqli-labs】 less56 GET -Challenge -Union -14 queries allowed -Variation3 (GET型 挑战 联合查询 只允许14次查询 变化3)

    单引号括号闭合 http://192.168.136.128/sqli-labs-master/Less-56/?id=1')%23 http://192.168.136.128/sqli-labs- ...

  8. HDU_1394_Minimum Inversion Number_线段树求逆序数

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  9. makefile 与 make

    所要完成的Makefile 文件描述了整个工程的编译.连接等规则.其中包括:工程中的哪些源文件需要编译以及如何编译.需要创建那些库文件以及如何创建这些库文件.如何最后产生我们想要的可执行文件.尽管看起 ...

  10. python笔记之发送邮件

    发送邮件前提:开启邮箱授权码 一.开启授权码(以163邮箱为例) 1.登录163邮箱,点击设置--POP3/SMTP/IMAP,出现设置界面   2. 开启SMTP服务且可以查询SMTP的host地址 ...