曼哈顿MST学习笔记
曼哈顿MST的学习笔记
这几天一直在验wsydalao的题,需要用到曼哈顿MST,于是赶紧补一下功课。
定义
- 曼哈顿距离:平面上两点\((x_1,y_1)\)和\((x_2,y_2)\)之间的曼哈顿距离为:\(|x_1-x_2|+|y_1-y_2|\)(为了方便我们之后简称为\(dis\))
- 曼哈顿MST:平面上若干个点,他们两两之间存在一条权为其\(dis\)的边,求这个图的最小生成树
朴素做法
- 考虑两两之间暴力连边,之后跑一下最短路
- 但这样时间复杂度显然是无法接受的
- 你会发现我们并没有利用这是一个平面图的性质
定理
- 在曼哈顿MST中,对于点\((x,y)\),以其为\((0,0)\)建系,并且将四个象限共分为八份。
- 可以证明:\((x,y)\)只可能与某个区域中\(dis\)最小的点连边,每个区域最多连一个
- 所以只需要\(8N\)条边
证明(不太严谨)
设原点为\(A\),以\(R_1\)区域为例,有两点\(B(x_1,y_1),C(x_2,y_2)\)在\(R_1\)区域,并且有\(dis(A,B) \leq dis(A,C)\)
由图可知,对于在\(R_1\)区域中的所有点\(i\),都有\(x_i<y_i\)
-
若\(x_1 \leq x_2\)且\(y_1 \leq y_2\)
\(\therefore dis(B,C) = (x_2 - x_1) + (y_2-y_1) = AC-AB\)
\(\therefore dis(A,B) + dis(B,C) = dis(A,C)\)
\(\therefore dis(B,C) < dis(A,C)\)
\(\therefore\) 在此情况下,连接\(BC\)和\(AB\)一定优于\(AC\)和\(AB\)
-
若\(x_1 \leq x_2 \)且\(y_1 > y_2\)
\(\therefore AC - BC = [x_2-(x_2-x_1)] +[y_2-(y_1-y_2)] = x_1 - y_1 + 2y_2\)
假设$AC < BC $ ,则:\(x_1-y_1+2y_2 < 0 \Rightarrow y_1 > x_1 + 2y_2\)
两边同时加上\(x_1\)得:\(dis(A,B) = x_1 + y_1 > 2x_1 + 2y_2 > x_1 + 2y_2 > 2y_2\)
$\because x_1 \leq x_2 < y_2 < y_1,dis(A,C) = x_2 + y_2 $
\(\therefore dis(A,C) = x_2 +y _2 < 2y_2 < dis(A,B)\)
与前提\(dis(A,B) \leq dis(A,C)\)不符,所以假设不成立,所以\(AC \leq BC\)
\(\therefore\) 在此情况下,连接\(BC\)和\(AB\)一定优于\(AC\)和\(AB\)
-
若$ x_1 > x_2 $ 且 $ y_1 \leq y_2 $ ,同理可证
-
若$ x_1 > x_2 $ 且 $ y_1 > y_2 $
\(\therefore x_1 + y_1 > x_2 + y_2\)
与\(dis(A,B) \leq dis(A,C)\)不符,所以不成立
综上所述,在\(R_1\)内,必有\(AB+BC > AB+AC\),且\(B\)为在\(R_1\)离\(A\)最近的点
所以,\(A\)在\(R_1\)内只能连最近点
\(R_2,R_3,R_4...R_8\)同理可证
实现
- 遍历所有点,找出其8个区域内的最近点连边
- 跑一遍最小生成树
实际上,由于生成树的边具有双向性,所以我们只考虑一四象限即可,也就是只考虑4个区域
假设我们的原点为\((x,y)\)
- \(R_1\): 设最近点为\((x_1,y_1)\),则\(dis = x_1 - x+ y_1 - y\)最小,由于此时\(x,y\)是定值,我们只需要使得\(x_1+y_1\)最小即可。所以\(R_1\)最近的点为:在所有\(x_i>x,y_i-y>x_i-x \Rightarrow x+y > x_i-y_i\)的点中,\(x_i+y_i\)最小的点
- \(R_2\):设最近点为\((x_1,y_1)\),则\(dis = x_1 - x+ y_1 - y\)最小,由于此时\(x,y\)是定值,我们只需要使得\(x_1+y_1\)最小即可。所以\(R_2\)最近的点为:在所有\(x_i>x,y_i-y<x_i-x \Rightarrow x+y < x_i-y_i\)的点中,\(x_i+y_i\)最小的点
- \(R_3\):设最近点为\((x_1,y_1)\),则\(dis = x_1 - x+ y - y_1\)最小,由于此时\(x,y\)是定值,我们只需要使得\(x_1-y_1\)最小即可。所以\(R_3\)最近的点为:在所有\(x_i>x,y-y_i<x_i-x \Rightarrow x+y < x_i+y_i\)的点中,\(x_i-y_i\)最小的点
- \(R_4\):设最近点为\((x_1,y_1)\),则\(dis = x_1 - x+ y - y_1\)最小,由于此时\(x,y\)是定值,我们只需要使得\(x_1-y_1\)最小即可。所以\(R_4\)最近的点为:在所有\(x_i>x,y-y_i>x_i-x \Rightarrow x+y > x_i+y_i\)的点中,\(x_i-y_i\)最小的点
那么我们发现,这些信息始终离不开横纵坐标相加减,并且目标点必须在现在点的右侧,于是我们先把所有点按横坐标排序;再把\(xi+yi\)作为第一关键字,\(x_i-y_i\)作为第二关键字维护一个数据结构\(T\)
关于这个数据结构可以考虑权值线段树、权值树状数组或者平衡树