简单多边形内的最短路径树算法

简单多边形内的最短路径树算法

  • 前言
  • 字母定义
  • 性质
  • 算法准备
  • 算法

前言

本文主要介绍<< Linear-time algorithms for visibility and shortest path problems inside simple polygons >>中计算多边形内所有顶点距离多边形内一点的最短路径树的线性算法

字母定义

简单多边形 P P P
顶点个数 n n n
给定的源点 s s s

对于 P P P中的每个顶点 v v v
π ( s , v ) \pi(s,v) π(s,v)表示从s到v的最短欧几里得距离路径
简单多边形内的最短路径树算法_第1张图片
Q s p Q_{sp} Qsp表示所有 π ( s , v ) \pi(s,v) π(s,v)的并集,也叫 P P P的最短路径树(shortest path tree)

G G G表示 P P P内的三角剖分
T T T表示 G G G的对偶图
简单多边形内的最短路径树算法_第2张图片
d = u w d=uw d=uw表示 P P P中的一个对角线或边
a a a表示 u u u w w w Q s p Q_{sp} Qsp中的最近共同祖先
F = F u w = π ( a , w ) ∪ π ( a , w ) F=F_{uw}=\pi(a,w)\cup\pi(a,w) F=Fuw=π(a,w)π(a,w)表示对于 u w uw uw的通道, a a a为该通道的尖点(cusp)

性质

π ( s , u ) \pi(s,u) π(s,u) π ( s , w ) \pi(s,w) π(s,w)都是外凸(outward convex)

算法准备

计算多边形 P P P的三角剖分 ( O ( n ) O(n) O(n))

维持一个通道 F = F u w = [ u l , u l − 1 , . . . , a , w 1 , . . . , w k ] F=F_{uw}=[u_l,u_{l-1},...,a,w_1,...,w_k] F=Fuw=[ul,ul1,...,a,w1,...,wk],其中 a = u 0 = w 0 a=u_0=w_0 a=u0=w0表示 F F F的尖点, π ( a , v ) = [ u 0 , . . . , u l − 1 ] , π ( a , w ) = [ w 0 , . . . , w k ] \pi(a,v)=[u_0,...,u_{l-1}],\pi(a,w)=[w_0,...,w_k] π(a,v)=[u0,...,ul1],π(a,w)=[w0,...,wk], u l − 1 = u , w k = w u_{l-1}=u,w_k=w ul1=u,wk=w

F F F存储在 finger tree中,可以 O ( l o g δ ) O(log\delta) O(logδ)的时间内搜索到元素x,也可以 O ( l o g δ ) O(log\delta) O(logδ)的时间内在元素x处分开两颗子树( δ \delta δ表示 x x x到最近finger的距离).维持一个指向a的指针 C U S P ( F ) CUSP(F) CUSP(F).

算法从s和相邻顶点 v 1 v_1 v1开始, C U S P ( F ) = s CUSP(F)=s CUSP(F)=s.

算法

u u u w w w F F F的第一个和最后一个元素, a = C U S P ( F ) a=CUSP(F) a=CUSP(F).
Δ u w x \Delta uwx Δuwx G G G中以 u w uw uw为边且未被处理的唯一三角形

  1. F F F中二分搜索 v v v,满足 v x vx vx F F F相切,若没有,则 v = a v=a v=a.
    F ∪ { x } F\cup \{x\} F{x}划分为通道 F 1 = [ u , . . . , v , x ] 和 F 2 = [ x , v , . . . , w ] F_1=[u,...,v,x]和F_2=[x,v,...,w] F1=[u,...,v,x]F2=[x,v,...,w]
    v v v属于 π ( a , u ) \pi(a,u) π(a,u),则 C U S P ( F 1 ) = v , C U S P ( F 2 ) = a CUSP(F_1)=v,CUSP(F_2)=a CUSP(F1)=v,CUSP(F2)=a
    否则, C U S P ( F 1 ) = a , C U S P ( F 2 ) = v CUSP(F_1)=a,CUSP(F_2)=v CUSP(F1)=a,CUSP(F2)=v
  2. π ( s , x ) = π ( s , v ) ∪ v x \pi(s,x)=\pi(s,v)\cup vx π(s,x)=π(s,v)vx,只需将 x x x的返回指针指向 v v v
  3. 如果 u x ux ux是对角线,继续Algorithm( F 1 F_1 F1).如果wx是对角线,继续Algorithm( F 1 F_1 F1).

你可能感兴趣的:(科研,Algorithm,算法,图论,几何学)