题意


给定平面内一些点,求最小曼哈顿距离生成树


看这篇咯http://blog.csdn.net/acm_cxlove/article/details/8890003

#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100010
#define X first
#define Y secondusing namespace std;typedef long long ll;int n,m,cnt,cnt0;
int B[N],C[N],D[N],fa[N];
ll Ans;
struct Point{int x,y,id;
}A[N];
struct edge{int u,v,w;edge(int u=0,int v=0):u(u),v(v){}friend bool operator <(edge a,edge b){return a.w<b.w;}
}E[N<<3];inline bool cmpx(Point a,Point b){return a.x<b.x;
}inline bool cmpy(Point a,Point b){return a.y<b.y;
}inline bool back(Point a,Point b){return a.id<b.id;
}inline void reaD(int &x){char c=getchar(); x=0; int f=1;for(;c>'9'||c<'0';c=getchar())if(c=='-') f=-1;for(;c>='0'&&c<='9';x=x*10+c-'0',c=getchar()); x*=f;
}inline int query(int x){int Min=1<<30,r=-1;for(;x<=cnt;x+=x&-x)if(C[x]<Min) Min=C[x],r=D[x];return r;
}inline void Add(int x,int y,int z){for(;x;x-=x&-x)if(y<C[x]) C[x]=y,D[x]=z;
}int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);
}int main(){reaD(n);for(int i=1;i<=n;i++)reaD(A[i].x),reaD(A[i].y),A[i].id=i;for(int i=1;i<=n;i++) B[i]=A[i].y-A[i].x;//1sort(A+1,A+1+n,cmpx);sort(B+1,B+1+n); cnt=unique(B+1,B+1+n)-B-1;memset(C,0x7f,sizeof(C)); memset(D,-1,sizeof(D));for(int i=n;i;i--){int x=lower_bound(B+1,B+1+cnt,A[i].y-A[i].x)-B,pos=query(x);if(pos>0) E[++cnt0]=edge(A[i].id,pos);Add(x,A[i].x+A[i].y,A[i].id);}//4memset(C,0x7f,sizeof(C)); memset(D,-1,sizeof(D));for(int i=1;i<=n;i++) B[i]=-A[i].x-A[i].y;sort(B+1,B+1+n); cnt=unique(B+1,B+1+n)-B-1;for(int i=n;i;i--){int x=lower_bound(B+1,B+1+cnt,-A[i].x-A[i].y)-B,pos=query(x);if(pos>0) E[++cnt0]=edge(A[i].id,pos);Add(x,A[i].x-A[i].y,A[i].id);}//2sort(A+1,A+1+n,cmpy);memset(C,0x7f,sizeof(C)); memset(D,-1,sizeof(D));for(int i=1;i<=n;i++) B[i]=A[i].x-A[i].y;sort(B+1,B+1+n); cnt=unique(B+1,B+1+n)-B-1;for(int i=n;i;i--){int x=lower_bound(B+1,B+1+cnt,A[i].x-A[i].y)-B,pos=query(x);if(pos>0) E[++cnt0]=edge(A[i].id,pos);Add(x,A[i].x+A[i].y,A[i].id);}//3memset(C,0x7f,sizeof(C)); memset(D,-1,sizeof(D));for(int i=1;i<=n;i++) B[i]=A[i].y+A[i].x;sort(B+1,B+1+n); cnt=unique(B+1,B+1+n)-B-1;for(int i=1;i<=n;i++){//printf("%d\n",i);int x=lower_bound(B+1,B+1+cnt,A[i].y+A[i].x)-B,pos=query(x);if(pos>0) E[++cnt0]=edge(A[i].id,pos);Add(x,A[i].x-A[i].y,A[i].id);}//mstsort(A+1,A+1+n,back);for(int i=1;i<=cnt0;i++)E[i].w=abs(A[E[i].u].x-A[E[i].v].x)+abs(A[E[i].u].y-A[E[i].v].y);sort(E+1,E+1+cnt0);//for(int i=1;i<=cnt0;i++) printf("%d %d %d\n",E[i].u,E[i].v,E[i].w);for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=cnt0;i++){if(find(E[i].u)==find(E[i].v)) continue;fa[find(E[i].u)]=find(E[i].v);Ans+=E[i].w;}cout<<Ans<<endl;return 0;
}

另外还有求最大曼哈顿距离生成树,好像有个叫Boruvka的算法
就是每次找到图中独立的一个团,找到一条最长的一个端点在这个团中另一个端点属于另一个团的边,把这两个端点属于的团合并,记录答案。

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#define N 100010
#define X first
#define Y secondusing namespace std;typedef long long ll;
typedef pair<int,int> paris;
typedef pair<ll,paris> parpar;
typedef set<paris>::iterator itr;int n;
int fa[N],vis[N];
int val[N][4];
paris p[N];
ll Ans;
set<paris> S[4];
vector<parpar> A;
vector<int> V[N];int dx[4]={1,1,-1,-1},dy[4]={1,-1,-1,1};inline void reaD(int &x){char c=getchar();x=0; int f=1;for(;c>'9'||c<'0';c=getchar())if(c=='-')f=-1;for(;c>='0'&&c<='9';x=x*10+c-'0',c=getchar()); x*=f;
}int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); }inline bool iUnion(int x,int y){x=find(x); y=find(y);if(x==y) return 0;if(V[x].size()>V[y].size()) swap(x,y);for(int i=0;i<V[x].size();i++)V[y].push_back(V[x][i]);V[x].clear();fa[x]=y;return 123;
}int main(){freopen("mst.in","r",stdin);freopen("mst.out","w",stdout);reaD(n);for(int i=1;i<=n;i++)reaD(p[i].X),reaD(p[i].Y);for(int i=1;i<=n;i++){fa[i]=i,V[i].push_back(i);for(int j=0;j<4;j++){val[i][j]=p[i].X*dx[j]+p[i].Y*dy[j];S[j].insert(paris(val[i][j],i));}}int linked=0;while(!linked){memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){int x=find(i);if(vis[x]) continue;if(V[x].size()==n){ linked=1; break; }vis[x]=1;for(int j=0;j<V[x].size();j++){int u=V[x][j];for(int k=0;k<4;k++)S[k].erase(paris(val[u][k],u));}int v; ll Max=-1;for(int j=0;j<V[x].size();j++){int u=V[x][j];for(int k=0;k<4;k++){itr it=S[(k+2)%4].end(); it--;if(1ll*it->X+val[u][k]>Max) Max=1ll*it->X+val[u][k],v=it->Y;}}A.push_back(parpar(Max,paris(x,v)));for(int j=0;j<V[x].size();j++){int u=V[x][j];for(int k=0;k<4;k++)S[k].insert(paris(val[u][k],u));}}for(int i=0;i<A.size();i++){int u=A[i].Y.X,v=A[i].Y.Y; ll w=A[i].X;if(iUnion(u,v)) Ans+=w;}}cout<<Ans<<endl;return 0;
}

[BZOJ2177][最小/最大(曼哈顿距离)生成树]曼哈顿最小生成树相关推荐

  1. 曼哈顿距离与曼哈顿矩形-打印回字型矩阵

    曼哈顿距离与曼哈顿矩形 食用指南: 题目描述: 题目分析: 法一:曼哈顿距离 法二:数组下标与值的关系 方向1:用距离推导关系 方向2:只看下标和值关系 法三:对称化简(严格说属于技巧而非方法) 算法 ...

  2. 曼哈顿距离最小生成树

    一.参考博客 博客:曼哈顿距离最小生成树与莫队算法 博客:学习总结:最小曼哈顿距离生成树 二.前置知识 1.曼哈顿距离:给定二维平面上的N个点,在两点之间连边的代价.(即distance(P1,P2) ...

  3. 【数据结构】最大曼哈顿距离

    问题描述: 给一系列操作,每个操作是新增或删除一个高维点(1-5维),给出每次操作后现有点集里两点的最大曼哈顿距离.曼哈顿距离是指两个点的一范数,即每个维度差的绝对值之和. 输入: 第一行有两个数,第 ...

  4. 简单粗暴理解与实现机器学习之K-近邻算法(三):距离度量、欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化距离、余弦距离、汉明距离、杰卡德距离、马氏距离

    K-近邻算法 文章目录 K-近邻算法 学习目标 1.3 距离度量 1 欧式距离**(Euclidean Distance):** 2 **曼哈顿距离(Manhattan Distance):** 3 ...

  5. 各种距离 欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准欧氏距离、马氏距离、余弦距离、汉明距离、杰拉德距离、相关距离、信息熵...

    1. 欧氏距离(Euclidean Distance) 欧氏距离是最容易直观理解的距离度量方法,我们小学.初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离. 二维平面上点a(x1,y1)与b( ...

  6. K邻近算法概述、欧式距离、Scikit-learn使用 、kNN邻近算法距离度量、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化欧氏距离、余弦距离、汉明距离、杰卡德距离、马氏距离

    一.K-邻近算法概述 K邻近算(K Nearest Neighbor算法,KNN算法):如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...

  7. 距离向量(欧式距离、曼哈顿距离等)

    二.距离向量 1)欧氏距离 欧式距离是最容易值观理解的距离度量方法. 2)曼哈顿距离 在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点之前的直线距离.这个实际的驾驶距离就是&qu ...

  8. 2个点马氏距离计算实例_数据分析基础:距离度量方式(欧式距离、马氏距离、曼哈顿距离)...

    数据分析中,为了评定数据之间的相似度,有很多不同的距离的计算方法,如欧氏距离,马氏距离等等. 欧氏距离 Euclidean distance:欧几里得距离,m维空间中两个点之间的真实距离 离差平方和, ...

  9. 什么是范数,及其对应的 “曼哈顿距离“、“欧式距离“、“闵氏距离“、“切比雪夫距离“

    什么是范数,及其对应的 "曼哈顿距离"."欧式距离"."闵氏距离"."切比雪夫距离" 一.什么是范数 二.欧式距离(对应 ...

  10. 曼哈顿距离及其应用场景/曼哈顿距离与欧氏距离的不同

    欧氏距离 上过初中的同学都知道,欧式距离是用来运算两个坐标之间的直线差值的方法,其公式为: 在一维坐标系内: d = ∣ x 1 − x 2 ∣ d = |x_1-x_2| d=∣x1​−x2​∣ 在 ...

最新文章

  1. c++判断奇偶_常用的数据差错控制技术(2) 奇偶校验
  2. vue 数据劫持详解
  3. LeetCode 01. 两数之和
  4. 计算机英语bane,英语单词bane是什么意思,英文单词查询bane,在线单词bane翻译...
  5. 一个数据库管理员的自我救赎之路
  6. 任正非卸任上海华为董事;百度“云手机”今日线上发布;Inkscape 1.0 RC 版发布 | 极客头条...
  7. java安装错误咋办_win7系统安装Java出现错误的解决方法
  8. 联想硬盘保护系统 安装详解
  9. 使用阿里云对象存储OSS搭建网盘
  10. 12,verilog移位操作
  11. 哥德巴赫猜想 php,C++_c++验证哥德巴赫猜想,哥德巴赫猜想是世界近代三大 - phpStudy...
  12. 人工智能技术应用的领域主要有哪些?
  13. 在 Windows 系统下常用的 bat 脚本分享
  14. 2.数据的结构 (学校考试必考概念)-数据结构入门(c语言实现)
  15. 华章IT图书书讯(2011年第6期)
  16. VSCODE配置C/C++
  17. html换行不出现横线,wps为什么在换行空格下划线不显示
  18. 程序员,你得选准买房的时间!
  19. 华为软开云7--部署
  20. 人脸性别转换APP有什么?快把这些APP收好

热门文章

  1. 03-ES6语法:模板字面量(Template Literals)
  2. Web前端——什么是web前端,什么是HTML及其常用标签
  3. 使OEM分区变成可格式化
  4. Redis技术贴一览表
  5. 国产FPGA芯片资源性能对照比较一览表
  6. Qt中使用TCP和MC协议与三菱Q系列PLC通信
  7. C++ 学习笔记(22) Builder Pattern
  8. GGC/ITF/国自然
  9. 安徽大学计算机学院张静,安徽大学2011年国家励志奖学金获奖学生名单
  10. r语言查找是否存在空值_R语言读取数据空值