曼哈顿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\)条边

曼哈顿MST学习笔记_第1张图片

证明(不太严谨)

曼哈顿MST学习笔记_第2张图片

设原点为\(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

  • \(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+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-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\)

关于这个数据结构可以考虑权值线段树、权值树状数组或者平衡树

转载于:https://www.cnblogs.com/Neworld2002/p/10499029.html

你可能感兴趣的:(数据结构与算法)