平面图相关算法

· · 个人记录

全文大量使用机翻。

高效的平面性测试

摘要

这篇论文描述了一个高效的判定任意一张图 G 是否能嵌入到平面中的算法。这个算法基本可以看作由 Auslander 与 Parter 提出并被 Goldstein 正确形式化的的算法的迭代版本。这个算法使用了深度优先搜索,时空复杂度均为 O(V),其中 VG 中顶点数量。该算法的 ALGOL 实现在不到 12 秒内成功测试了多达 900 个顶点的图。

关键词:算法,复杂度,深度优先搜索,嵌入,genus,图,plam tree,平面性,生成树。

CR CATEGORIES: 3.24 5.25 5.32

1. 引言

图论是一个无尽的容易描述但非常困难的问题的来源。其中许多问题需要算法来解决;给定一个图,人们可能会问该图是否具有某种属性,而算法会提供答案。由于图被广泛用作真实现象的模型,因此发现回答图论问题的 高效 算法非常重要。本文提出了一种高效算法来判定图 G 是否可以嵌入平面(没有任何相交的边)。

这个算法基本可以看作由 Auslander 与 Parter [1] 提出并被 Goldstein [2] 正确形式化的的算法的迭代版本。这个算法使用 深度优先搜索 确定计算顺序从而使算法高效。深度优先搜索,或回溯,已被广泛用于寻找组合理论和人工智能问题的解决方案 [3, 4]。最近,这种类型的搜索已被用于构建高效的算法来解决图论中的几个问题,包括求双连通分量 [5, 6],求三连通分量 [7, 8],求强连通分量 [6],求支配集 [9],以及判定有向图是否可约 [10, 11]。

为了分析平面性算法的理论效率,使用随机访问模型。假设数据存储与访问、算术运算、比较、逻辑运算只需要固定时间完成。一个内存单元允许保存绝对值 \le kV 的整数,其中 k 为常数且 V 是顶点数。Cook [12] 按照这些方法描述了一个精确计算机模型。如果 f,g 是关于 x 的函数且存在常数 k_1,k_2 使得对于所有 x|f(x)|\le k_1|g(x)|+k_2,我们称“f(x)O(g(x))”。使用这个框架,平面性算法具有 O(V) 的时间与空间界限,在常数因子内是最优的。

该算法的实际效率由斯坦福大学版本的 ALGOL W 语言的实现来测量 [13]。本文中的算法比最初编写的算法简单得多,但该程序能在不到 12 秒的 IBM 360/67 处理时间内分析多达 900 个点的图。

2. 平面性算法的先前研究

将图嵌入到平面中有几个应用。集成电路设计需要知道电路何时可以嵌入平面中。如果化学结构是平面的,那么判定化学架构是否同构将可以简化 [7, 14-20]。已发表的平面性算法的论文的数量表明了该问题的重要性。例如 [1, 2, 21-32]。但是,令人惊讶的是,很少有人对这些算法的时间复杂度进行严格分析,而且明显比先前算法更劣的算法正在不断出现。我们将在这里考察几个最高的算法;平面性问题的完整历史可以在 Shirey 的包含大量参考文献的论文 [28] 中找到。

对平面图的最早刻画是由 Kuratowski [33] 给出的。他证明了每个非平面图都包含一个子图,该子图在去除二度顶点后,要么同构于五个顶点的完全图,要么同构于六个顶点的完全二分图(图 1)。相反,没有平面图包含这两个图。虽然优雅,但 Kuratowski 的条件作为平面性的实际测试是无用的;如果不是更糟的话,直接测试此类子图可能需要至少与 V^6 成比例的时间,其中 V 是图中的顶点数。

解决平面性问题的最佳方法似乎是尝试构建给定图的平面嵌入的表示。如果这样的表示可以完成,那么图就是平面的;如果不是,则该图是非平面的。第一个这样的算法是由 Auslander 和 Parter [1] 提出的。首先,在图中找到一个环。当这个删除这个环时,图会被分为几个部分。递归调用该算法,以将每个部分嵌入到具有原始环的平面中。然后,如果可能的话,将这些部分的嵌入组合在一起,以嵌入整个图。不幸的是,Auslander 和 Parter 的论文存在错误;所提出的方法可能会无限循环。Goldstein [2] 使用迭代而不是递归正确地形式化了算法。Shirey [28] 使用图的链表结构表示实现了这种方法,并证明了他的算法变体的渐近时间界为 O(V^3)

Lempel, Even 和 Cederbaum [25] 提出了另一种在平面上构建图的方法。他们从单个顶点开始,并添加与该顶点相关的所有边。然后,他们添加所有与新顶点之一相连的边,并以此方式继续,直到构建整个图。要让算法正确工作,必须以特殊顺序选择顶点。Lempel, Even 和 Cederbaum 没有给出他们的方法的实现或时间界;然而,Tarjan [34] 以一种需要 O(V) 空间和 O(V\log V) 时间的方式实现了该算法。

Mondshein [27] 最近提出了另一种构造算法。他一次添加一个顶点,直到构造出整个图。顶点选择的顺序仍然至关重要。Mondshein 的实现需要 O(V\log V) 时间。Hopcroft 和 Tarjan [24] 在一个复杂的程序中使用深度优先搜索,设计了一种 Goldstein 算法的变体,其时间界为 O(V\log V)。随后,他们发现了一种具有 O(V) 时间界的改进算法,其早期版本出现在 Tarjan 的论文 [29] 中。这里提出的算法是对 [29] 的相当简化。

一些算法因其新颖的方法而值得一提。Fisher [23] 给出了一种直接在图的邻接矩阵中运行的算法。然而,这种方法不是很有效,任何使用邻接矩阵的方法都不够有效。Bruno, Steiglitz 和 Weinberg [21] 提出了一种基于 Tutte 关于三连通平面图的一些定理的算法。他们不是在平面上构造图,而是将其简化为越来越简单的图。虽然这些算法没有明确的时间界,但该算法与上述算法相比并不优越。

3. 准备工作

本节概述了理解平面性算法所需的一些图论概念。这一节还描述了图在计算机中的表示方式,以及深度优先搜索的工作原理。我们使用的定义类似于任何图论文章中的定义,例如 [35-38]。

G=(\mathcal{V,E}) 是由一组有限顶点 \mathcal V 和一组有限边 \mathcal E 组成的有序对。V 表示 G 中的顶点数量;E 表示边的数量。如果每条边都是一对无序的不同顶点,那么称图是 无向的 / undirected。如果每条边都是一对有序的不同顶点,那么图是 有向的 / directed。如果 (v,w) 是有向图中的边,我们说这条边 离开 v 进入 w。如果 \mathcal V_1\subseteq\mathcal V_2\mathcal E_1\subseteq\mathcal E_2,则图 G=(\mathcal V_1,\mathcal E_1) 是图 G_2=(\mathcal V_2,\mathcal E_2) 的子图。如果 G 是有向图,则 G无向版本 / undirected version 是通过将 G 的每条边转换为无向边并删除重复边而形成的无向图。

一个顶点序列 v_i,1\le i\le n 与边 e_i,1\le i<n,若满足 e_i=(v_i,v_{i+1}),则被称为 G 中一条 _从 v_1v_n 的路径 / path from v_1 to v_n_。存在一个顶点到其自身不包含边的路径。一个顶点 w 被称为从一个顶点 v 可达的 / reachable,如果存在从 vw 的路径。一条从一个顶点到其自身的路径被称为 闭合路径 / closed path。一条从 vv 的闭合路径如果包含至少一条边,且其任意两条边不相同,且到达两次的顶点只有 v,则被称为一个 环 / cycle。两个互相是对方环排列的环被视为同一个环。我们用 p:v\Rightarrow^\ast w 表示 p 是从 vw 的路径。

如果无向图 G 中的任何顶点都可以从任何其他顶点可达的,称 G连通的 / connectedG 的最大连通子图是良定义且顶点不相交的 [38],被称为 G连通分量 / connected components。如果 G 包含三个不同的顶点 x,v,w,使得 w 是从 v 可达的,但每条路径 p:v\Rightarrow^\ast w 都包含 x,则称 xG割点或分离点 / cutnode or separation point。如果 G 是连通的且不包含割点,称 G双连通的 / biconnectedG 的最大双连通子图是良定义且边不相交的 [37],被称为 G双连通分量 / biconnected components。如果 G 是双连通的,但包含四个不同的顶点 x,y,v,w,使得每条路径 p:v\Rightarrow^\ast w 都包含 xy,则称 (x,y)G分离对 / separation pair。如果 G 是双连通的且不包含分离对,称 G三连通的 / triconnected。图的三连通分量可以用多种方式定义 [8, 39]。我们可以通过考虑图的无向版本将这些定义扩展到有向图。

一个(有向的、有根的)树 / tree T 是带有一个特殊顶点的连通图,该特殊顶点被称为 根 / root r,且满足每个 T 中的顶点都是从 r 可达的,没有边进入 r,恰好一条边进入 T 中的其余顶点。关系“(v,w)T 的一条边”表示为 v\to w。关系“存在 T 中一条从 vw 的路径”表示为 v\to^\ast w。如果 v\to w,称 vw父节点 / fatherwv子节点 / son。如果 v\to^\ast w,称 vw祖先 / ancestorwv 的一个 后代 / descendant。每个顶点都是自身的祖先与后代。如果 v\to^\ast wv\ne w,称 vw真祖先 / proper ancestorwv真后代 / proper descendant。如果 T_1 是一棵树且 T_1 是树 T_2 的子图,称 T_1T_2子树 / subtree。如果树 T 是包含有向图 G 所有顶点的子图,称 TG生成树 / spanning tree

G平面的 / planar,当且仅当存在图的顶点和边到平面的映射,使得(1)每个顶点映射到一个不同的点,(2)每条边 (v,w) 映射到一条简单曲线上,顶点 v,w 映射到曲线的端点上,以及(3)不同边的映射只在其公共端点处重合。

满足上述条件的 G 的映射称为 G平面嵌入 / planar embedding。(如果 G 是平面的,则存在 G 的平面嵌入使得边被映射为直线。)我们需要关于平面图的两个引理。

引理 1。如果 G 是平面的,E\le 3V-3

若假设 V\ge3,界可以被加紧到 E\le 3V-6,但这对我们的目标不重要。

证明。这个引理是欧拉定理关于平面图中顶点、面和边的数量的直接结果 [35]。

引理 2。设 G 是嵌入在平面中的平面图。简洁起见,我们用嵌入来标识 G 的每条边。设 p_1,p_2,p_3 是三条从 xy 的路径,满足任意两条路径的公共点只有 x,y。设 (x,v_1),(x,v_2),(x,v_3) 分别为 p_1,p_2,p_3 的第一条边,设 (w_1,y),(w_2,y),(w_3,y) 分别为 p_1,p_2,p_3 的最后一条边。若在 x 周围这些边在平面中的出现顺序按顺时针为 (x,v_1),(x,v_2),(x,v_3),则在 y 周围这些边的出现顺序按顺时针为 (w_1,y),(w_3,y),(w_2,y)(图 2)。

证明。这是 Jordan 曲线定理的推论,该定理指出,一条简单闭合曲线恰好将平面划分为两个连通的区域。我们接受该引理而不去证明;Jordan 曲线定理很难证明。(见 [40, 41]。)

具有 V 个顶点的任意(无向)图可能有多达 E=V(V-1)/2 条边。但是,根据引理 1,平面图有 E\le3V-3。因此,可以设计一种具有关于顶点数量成线性关系的时间界的平面性算法。在计算机中表示图的一种方法是使用 V\times 邻接矩阵 / adjacency matrix M=(m_{ij}),其中如果 (i,j) 是边,则 m_{ij}=1,否则 m_{ij}=0。然而,邻接矩阵所需的存储空间量为 O(V^2),可以严格地证明,许多图问题(包括平面性问题)需要检查矩阵中的每个位,因此计算时间至少与 V^2 成正比 [42]。因此,我们使用称为 邻接结构 / adjacency structure 的链表结构来表示图。我们构造了一组 邻接链表 / adjacency lists A(v),每个顶点 v 对应一个链表。顶点 v 的链表包含每个满足 (v,w) 是一条图的边的顶点 w。如果 G 是无向图,则每条边 (v,w) 被表示两次:w 出现在 A(v) 中,v 出现在 A(w) 中。如果 G 是有向的,则每条边 (v,w) 被表示一次。w 出现在 A(v) 中。

图算法需要一种系统的方法来探索图。我们使用一种称为 深度优先搜索 / depth-first search 的方法。我们从 G 的一割顶点 s 开始,选择一条从 s 出发的边。访问边会得到一个新顶点。一般来说,我们通过选择和遍历从最近到达的仍有未访问的边的顶点开始的未访问的边来继续搜索。如果 G 是连通的,则每条边将被访问一次。

如果 G 是无向的,则 G 的深度优先搜索会给 G 的每条边上确定一个方向,该方向由搜索过程中访问边的方向给出。因此,搜索将 G 转化为有向图 G'。搜索还将(现在变为有向的)边分为两类:一组 树边 / tree arcs,定义了 G' 的生成树 T,以及一组满足 Tw\to^\ast vfrond (v,w) [6]。frond (v,w)v-\to w 表示。边可以这样划分的有向图 G' 称为 plam tree。深度优先搜索很重要,因为 palm tree 中的路径结构非常简单。

为了实现连通无向图的深度优先搜索,我们使用了一个简单的递归过程,该过程维护了一个可能有未访问边的旧顶点的栈。该过程使用要搜索的图的一组邻接链表,确切来说,搜索顺序取决于邻接链表中边的顺序。除了识别树边和 frond 外,该过程还按照搜索过程中到达的顺序对顶点进行编号,从 1V

begin comment routine for depth-first search of a graph G represented by adjacency lists A(v). Variable n denotes the last number assigned to a vertex;\

$\quad$**procedure** DFS(v, u); **comment** vertex u is the father of vertex v in the spanning tree being constructed;\ $\quad$**begin**\ $\qquad$n := NUMBER(v) := n + 1;\ $\qquad$a: **comment** dummy statement;\ $\qquad$**for** $w\in A(v)$ **do begin**\ $\qquad\quad$**if** NUMBER(w) = 0 **then begin**\ $\qquad\qquad$**comment** a is a new vertex;\ $\qquad\qquad$mark (v, w) as a tree arc;\ $\qquad\qquad$DFS(w, v);\ $\qquad\qquad$b: **comment** dummy statement;\ $\qquad\quad$**end**;\ $\qquad\quad$**else if** NUMBER(w) < NUMBER(v) and w $\ne$ u **then begin**\ $\qquad\qquad$**comment** this test is necessary to avoid exploring an edge in both directions;\ $\qquad\qquad$mark (v, w) as a frond;\ $\qquad\qquad$c: **comment** dummy statement;\ $\qquad\quad$**end**;\ $\qquad$**end**;\ $\quad$**end**;\ $\quad$**for** i := 1 **until** V **do** NUMBER(i) := 0;\ $\quad$n := 0;\ $\quad$**comment** the search starts at vertex s;\ $\quad$DFS(s, 0);\ **end**; 引理 3。上述过程正确地执行了无向图的深度优先搜索,如果图有 $V$ 个顶点和 $E$ 条边,该过程需要 $O(V+E)$ 时间。且顶点的标号满足:如果 $(v,w)$ 是树边,那么 $NUMBER(v)<NUMBER(w)$;如果 $(v,w)$ 是 frond,$NUMBER(w)<NUMBER(v)$。 ### 4. 平面性算法概述 本节简要介绍平面性算法背后的思想。第 5 节和第 6 节开发了详细分量,第7 节全面介绍了算法。该算法的第一步是去除边太多的图。我们计算图中的边数,如果计数超过 $3V-3$,我们就声明图是非平面的。接下来,我们将图划分为双连通分量。(当且仅当图的所有双连通分量都是平面的时,图才是平面的 [35]。)参考文献 [5, 6] 描述了如何在 $O(V+E)$ 时间内将图划分为双连通分量。然后我们测试每个分量的平面性。 为了测试分量的平面性,我们调用 DFS,将图转换为 palm tree $P$ 并对顶点进行编号。现在我们使用 Auslander, Parter 和 Goldstein 的算法。该算法在图中找到一个环并将其删除,留下一组不相连的部分。然后,该算法检查每个部分加上原始环的平面性(通过递归调用自身),并确定部分的嵌入是否可以组合起来,从而得到整个图的嵌入。让我们分别考察这个过程的找环部分和平面性测试部分。 为测试平面性,算法的每次递归调用要求我们找到图的部分的一个环。这个环将包含之前找到的循环中不包含的边的构成的简单路径,以及旧环中的边的一条简单路径组成。我们使用深度优先搜索将图划分为简单的路径,这些路径可以被组装成平面性测试所需的环。我们需要第二次搜索来找到路径,因为如果平面性测试要有效,搜索必须以特殊的顺序进行。第 5 节详细描述了路径查找过程,并证明了生成路径的一些重要性质。 现在考虑第一个环 $c$。它将包含一个树边的序列,后面是 $P$ 中的一个 frond。顶点的编号满足顶点沿环按数字顺序排列。不属于循环的每一部分都将由一个 frond $(v,w)$ 组成,或者由一条树边 $(v,w)$ 加上一棵根为 $w$ 的子树,再加上从子树中引出的所有 frond 组成。我们处理这些部分,并按照 $v$ 降序将它们添加到平面表示中。根据 Jordan 曲线定理,每个片段都“在 $c$ 内”或“在 $c$ 外”。当我们添加一个部分时,某些部分必须从 $c$ 的内部移动到外部或从外部移动到内部。(见图 4。)我们持续添加新部分,并在必要时移动旧部分,直到无法添加部分或整个图被嵌入平面中。第 6 节描述了在移动部分时跟踪部分所需的数据结构。下面是整个算法的概述。 ![](https://cdn.luogu.com.cn/upload/image_hosting/27p4tvdc.png) **procedure** PLANARITY(G);\ **begin comment** an outline of the planarity algorithm;\ $\quad$**integer** E;\ $\quad$E := 0;\ $\quad$**for** each edge of G **do begin**\ $\qquad$E := E + 1;\ $\qquad$**if** E > 3V - 3 **then go to** nonplanar;\ $\quad$**end**;\ $\quad$divide G into biconnected components;\ **for** each biconnected component G **do begin**\ $\qquad$explore C to number vertices and transform C into a palm tree P;\ $\qquad$find a cycle c in P;\ $\qquad$construct planar representation for c;\ $\qquad$**for** each piece formed when c is deleted **do begin**\ $\qquad\quad$apply algorithm recursively to determine if piece plus cycle is planar;\ $\qquad\quad$**if** piece plus cycle is planar **and** piece maybe added to planar representation **then** add it **else**\ $\qquad\qquad$**go to** nonplanar;\ $\quad\quad$**end**;\ $\quad$**end**;\ **end**; ### 5. 路径寻找 此后我们假设 $G$ 是已被 DFS 探索、顶点被标号并构造了一棵 palm tree $P$ 的双连通图。我们将用顶点的标号标识顶点。如果 $v$ 是顶点,设 $S_v=\{w|\exists u(v\to^\ast u\land u-\to w)\}$。则 $S_v$ 是从 $v$ 的后代通过 frond 可达的节点的集合。令: $$\begin{cases}\operatorname{LOWPT1}(v)=\min(\{v\}\cup S_v)\\\operatorname{LOWPT2}(v)=\min(\{v\}\cup(S_v-\{\operatorname{LOWPT1(v)}\}))\end{cases}$$ $\operatorname{LOWPT1}(v)$ 是 $v$ 后代通过一条 frond 可达的小于 $v$ 的最小的顶点,且 $\operatorname{LOWPT2}(v)$ 是 $v$ 后代通过一条 frond 可达的低于 $v$ 的第二小的顶点。按照惯例,如果这些值未定义,那么这些值都等于 $v$。除非 $\operatorname{LOWPT1}(v)=\operatorname{LOWPT2}(v)=v$,那么 $\operatorname{LOWPT1}(v)\ne\operatorname{LOWPT2}(v)$。节点 $v$ 的 $\operatorname{LOWPT}$ 值只取决于 $v$ 的子节点的 $\operatorname{LOWPT}$ 值与离开 $v$ 的 frond;因此很容易使用 DFS 计算 $\operatorname{LOWPT}$ 值。在 DFS 中的无用语句 a, b, c 处插入下面的语句可以得到一个计算 $\operatorname{LOWPT}$ 值的过程。 **comment** additions to DFS for calculation of LOWPT1, LOWPT2;\ a: LOWPT1(v) := LOWPT2(v) := NUMBER(v);\ b: **if** LOWPT1(w) < LOWPT1(v) **then begin**\ $\quad$LOWPT2(v) := min{LOWPTl(v), LOWPT2(w)};\ $\quad$LOWPT1(v) : = LOWPT1(w) ;\ **end**\ **else if** LOWPT1(w) := LOWPT1(v) **then**\ $\quad$LOWPT2(v) := min{LOWPT2(v), LOWPT2(w)};\ **else** LOWPT2(v) := min{LOWPT2(v), LOWPT1(w)};\ c: **if** NUMBER(w) < LOWPT1(v) **then begin**\ $\quad$LOWPT2(v) := LOWPT1(v);\ $\quad$LOWPT1(v) := NUMBER(w);\ **end**\ **else if** NUMBER(w) > LOWPT1(v) **then**\ $\quad$LOWPT2(v) := min{LOWPT2(v), NUMBER(w)}; 很容易验证按上述修改后的 DFS 会在 $O(V+E)$ 时间内正确计算出 $\operatorname{LOWPT}$ 值。(见 [6, 8, 29]。)如 [5, 6] 中所述,$\operatorname{LOWPT1}$ 可以用于检测 $G$ 的双连通性。这是一个重要的相关引理: 引理 4。若 $G$ 是双连通的,$v\to w$,除非 $v=1$,那么 $\operatorname{LOWPT1}(w)<v$,若 $v=1$,则 $\operatorname{LOWPT1}(w)=v=1$。且 $\operatorname{LOWPT1}(1)=1$。 证明。见 [6]。 为了生成路径,我们根据 $\operatorname{LOWPT}$ 值对 $P$ 的邻接链表排序,并进行另一次 DFS。设 $\phi$ 是如下定义在 $P$ 的边 $(v,w)$ 上的函数: $$\phi((v,w))=\begin{cases}2w&v-\to w\\2\operatorname{LOWPT1}(w)&v\to w\land\operatorname{LOWPT2}(w)\ge v\\2\operatorname{LOWPT1}(w)+1&v\to w\land\operatorname{LOWPT1}(w)<v\end{cases}$$ 对每条 $P$ 中的边计算 $\phi((v,w))$,按 $\phi$ 自增顺序排序邻接链表,使用基数排序达到 $O(V+E)$ 时间界。可以这样实现: **comment** construction of ordered adjacency lists;\ **for** i := 1 until 2V + 1 **do** BUCKET(i) := the empty list;\ **for** (v, w) an edge of G **do begin**\ $\quad$compute $\phi((v,w))$;\ $\quad$add (v, w) to $\operatorname{BUCKET}(\phi((v,w)))$;\ **end**;\ **for** v := 1 **until** V **do** A(v) := the empty list;\ **for** i := 1 **until** 2V + 1 **do**\ $\quad$**for** $(v,w)\in\operatorname{BUCKET}(i)$ **do** add w to end of A(v); 该过程给出了一组表示 $P$ 的正确排序的邻接链表。现在,我们通过使用新的邻接链表对 $P$ 应用深度优先搜索来生成路径。每次我们遍历一条边时,都会将其添加到正在构建的路径中。每次我们穿过一条 frond 时,该 frond 都会成为当前路径的最后一条边。下一条边开始一条新路径。因此,每条路径都由一个树边的序列和一条 frond 组成。为了实现这一点,我们使用以下步骤: **begin comment** routine to generate paths in a biconnected palm tree with specially ordered adjacency lists A(v). Vertex s is a global variable, the start vertex of the current path, and is initialized to 0;\ **procedure** PATHFINDER(v);\ $\quad$**for** $w\in A(v)$ do\ $\qquad$**if** $v\to w$ **then begin**\ $\qquad\quad$**if** s = 0 **then begin**\ $\qquad\qquad$s := v;\ $\qquad\qquad$start new path;\ $\qquad\quad$**end**;\ $\qquad\quad$add (v, w) to current path;\ $\qquad\quad$PATHFINDER(w);\ $\qquad$**end**\ $\qquad$**else begin**\ $\qquad\quad$**comment** $v-\to w$;\ $\qquad\quad$**if** s = 0 **then begin**\ $\qquad\qquad$s := v;\ $\qquad\qquad$start new path\ $\qquad\quad$**end**;\ $\qquad\quad$add (v, w) to current path;\ $\qquad\quad$output current path;\ $\qquad\quad$s := 0;\ $\qquad$**end**;\ $\quad$s := 0;\ $\quad$**comment** vertex 1 is the start vertex of the search;\ $\quad$PATHFINDER(1)\ **end**; ![](https://cdn.luogu.com.cn/upload/image_hosting/2xcvqmuc.png) 以这种方式生成的路径具有几个重要属性,这些属性在以下引理中被总结。图 5 显示了从图 3 中的图生成的一组路径。程序 PATHFINDER 需要 $O(V+E)$ 时间在有 $V$ 个顶点和 $E$ 条边的图中查找路径;添加到路径的边总数为 $O(V+E)$,PATHFINDER 只是一个有一些额外的操作来构造路径的深度优先搜索。事实上,对于平面性算法,我们只需要知道每条路径的起始顶点和结束顶点。 引理 5。设 $p:s\Rightarrow^\ast f$ 为一条生成的路径。若我们考虑当 $p$ 中第一条边被遍历时所有没被用到的 frond,则 $f$ 是通过 $s$ 的任意后代通过一条这样的 frond 到达的最小的顶点。如果 $n\ne s,v\ne f$,且 $v$ 在路径 $p$ 上,则 $f$ 是从 $v$ 的一个后代通过任意 frond 可达的(当 $p$ 的第一条边被遍历时,所有从 $v$ 的后代出发的 frond 都没有被使用)。 证明。该引理是邻接链表序列顺序的直接推论。 引理 6。设 $p:s\Rightarrow^\ast f$ 为一条生成的路径。则 $P$ 的生成树中 $f\to^\ast s$。若 $p$ 是第一条路径,则 $p$ 是环;否则 $p$ 是简单路。若 $p$ 不是初始路径,$p$ 与之前生成的路径包含恰好两个相同的顶点($f$ 与 $s$)。 证明。设 $p:s\Rightarrow^\ast f$ 为任意一条生成的路径。若该路径仅包含一条 frond,则该路径是简单路且 $f\to^\ast s$。若路径包含一条树边,设 $s\to v$ 是第一条树边。则由引理 5,$f=\operatorname{LOWPT1}(v)$。若 $s=1$ 路径是环,若 $s>1$,由引理 4,路径是简单路。任意情况中 $f\to^\ast s$。 引理 7。设 $p_1:s_1\Rightarrow^\ast f_1,p_2:s_2\Rightarrow^\ast f_2$ 为两条生成的路径。若 $p_1$ 在 $p_2$ 前生成,且 $s_1$ 是 $s_2$ 的祖先,则 $f_1\le f_2$。 证明。$p_2$ 的终止 frond 导向一个在 $p_1$ 被生成时没有用到的 $s_1$ 的后代。由引理 $5$ 可知 $f_1\le f_2$。 引理 8。设 $p_1:s\Rightarrow^\ast f,p_2:s\Rightarrow^\ast f$ 为两条由相同起点与终点的生成的路径。设 $v_1$ 为 $p_1$ 的第二个顶点且 $v_2$ 为 $p_2$ 的第二个顶点。设 $p_1$ 在 $p_2$ 前生成且 $v_1\ne f$ 且 $\operatorname{LOWPT2}(v_1)<s$。那么 $v_2\ne f,\operatorname{LOWPT2}(v_2)<s$。 证明。因为 $p_1$ 早于 $p_2$ 生成,所以 $A(s)$ 中 $v_1$ 一定出现在 $v_2$ 前。该引理由 $A(s)$ 的顺序限制即可证明。 引理 8 是我们在路径寻找算法中引入 $\operatorname{LOWPT2}$ 值的原因。当我们考虑路径在平面中的嵌入时,我们会知道为什么这个引理很重要。 设 $p:s\Rightarrow^\ast f$ 为一条生成的路径,我们可以通过将一组树边 $f\to^\ast s$ 加入 $p$ 形成一个环。这样形成的环就是由 Auslander-Parter-Goldstein 平面性算法的递归调用所生成的环。这些环有一个简单的结构;每个环都对应于 $P$ 一条 frond。在考虑路径的嵌入前我们需要一些别的定义。设 $p:s\Rightarrow^\ast f$ 为路径寻找算法生成的一条简单路,设 $p_0:s_0\Rightarrow^\ast f_0$ 为包含 $s$ 的最早被生成的路径。若 $f_0<f$ 则 $p$ 被称为 _正常路径 / normal path_。若 $f_0=f$ 则 $p$ 被称为 _特殊路径 / special path_。由引理 7,$f_0>f$ 的情况不可能出现。 ### 6. 嵌入路径 若 $G$ 是带有由路径寻找算法生成的一组路径的双连通图,我们通过尝试在平面中逐次加入路径来判定 $G$ 的平面性。设 $c$ 为第一条路径(一个环)。这个环包含一组树边 $1\to v_1\to\cdots\to v_n$,后为一条 frond $v_n\to1$。顶点的编号满足 $1<v_1<\cdots<v_n$。当删除 $c$ 时,$G$ 分裂为若干连通部分,这些部分被称为 _段 / segments_。每个段 $S$ 要么仅包含一条 frond $(v_i,w)$ 要么包含树边 $(v_i,w)$ 加上以 $w$ 为根的子树加上所有从子树出发的 frond。路径生成的顺序满足一个段中的所有路径都在其余段的路径被生成前生成,且路径按照 $v_i$ 递减顺序探索。 根据 Jordan 曲线定理。一个段必须完全嵌入到 $c$ 的一侧。一个段通过一条从 $c$ 出发的边 $(v_i,w)$ 与一条或更多从 $c$ 出发的 frond 附加到 $c$。(如果该段只由一条 frond 组成,该 frond 的两个端点都在 $c$ 上。)如果 $v_i$ 周围边的出现顺序(顺时针)为 $(v_{i-1},v_i),(v_i,w),(v_i,v_{i+1})$,我们称段 $S$ 被嵌入到($c$ 的)_左侧 / left_。如果 $v_i$ 周围边的出现顺序为 $(v_{i-1},v_i),(v_i,v_{i+1}),(v_i,w)$,我们称段 $S$ 被嵌入到 _右侧 / right_。若所属的段属于 $c$ 的左侧(右侧),我们称进入 $c$ 的 frond 被嵌入到 _左侧 / left(右侧 / right)_。若 $(x,v_j)$ 从左侧进入 $c$,则由引理 2,$v_j$ 周围边的出现顺序为 $(v_{j-1},v_j),(x,v_j),(v_j,v_{j+1})$。 设 $c$ 与 $S$ 前被探索的段已经被嵌入到平面中。设 $p:v_i\Rightarrow^\ast v_j$ 为 $S$ 中找到的第一条路径。下面的引理给出了将 $p$ 加入到嵌入中的充要条件。 引理 9。路径 $p:v_i\Rightarrow^\ast v_j$ 可以通过将其放置在 $c$ 的左侧(右侧)将其添加入平面嵌入中当且仅当之前在左侧(右侧)嵌入的 frond 中不存在 $(x,v_k)$ 满足 $v_j<v_k<v_i$。 证明。如果没有 frond 满足条件,则没有任何类型的嵌入边在 $v_j$ 和 $v_i$ 之间在左侧(右侧)进入或离开 $c$。如果路径 $p$ 足够靠近 $c$,即可嵌入到 $c$ 的左侧(右侧)。相反,假设我们想在左测嵌入 $p$,但一些 $v_j<v_k<v_i$ 的已嵌入的 frond $(x,v_k)$ 从左侧进入 $c$。要么 $x$ 位于 $c$ 上(设 $x=v_l$),要么 $(x,v_k)$ 是第一条边为 $(v_l,w)$ 的段 $S'$ 的一部分。我们根据路径生成的顺序知道 $v_l\ge v_i$。我们必须考虑两种情况。 ![](https://cdn.luogu.com.cn/upload/image_hosting/w2xmepyo.png) 情况 1。$v_l>v_i$(图 6 (a) )。设 $p$ 在左侧嵌入。由 $p$,一条 $S'$ 中连接 $v_l,v_k$ 的路径,与从 $v_j$ 到 $v_l$ 的树边的路径,我们可以构造三条违反引理 2 的从 $v_i$ 出发到达 $v_k$ 的路径。因此 $p$ 不能在左侧嵌入。 情况 2。$v_l=v_i$。设 $p_1:v_l\Rightarrow^\ast v_m$ 为 $S'$ 中第一条被找到的路径。由引理 7,我们有 $v_m\le v_j$。有两种子情况。 子情况 A。$v_m<v_j$(图 6 (b) )。设 $p$ 在左侧嵌入,由路径 $p$,一条 $S'$ 中连接从 $v_k$ 出发到达 $v_m$ 的路径,与从 $v_m$ 出发到达 $v_i$ 的树边的路径我们可以形成三条违反引理 2 的从 $v_k$ 出发到达 $v_j$ 的路径。因此 $p$ 不能在左侧嵌入。 子情况 B。$v_m=v_j$(图 6 (c) )。设 $y$ 为 $p$ 上第二个顶点($w$ 已被定义为 $p_1$ 的第二个顶点)。因为段 $S'$ 包含 frond $(x,v_k)$ 且$w\ne v_m$ 且 $\operatorname{LOWPT2}(w)<v_i$。比较 $p,p_1$ 并应用引理 8,我们有 $y\ne v_j$ 且 $\operatorname{LOWPT2}(y)<v_i$。更进一步,因为 $\operatorname{LOWPT1}(y)=v_j$,通过引理 5,我们有 $\operatorname{LOWPT2}(y)>v_j$。设 $p$ 在左侧嵌入。由 $p,p_1$,一条从 $p$ 上顶点到 $\operatorname{LOWPT2}(y)$ 的路径,一条从 $p_1$ 上顶点到 $v_k$ 的路径,与一条连接 $v_k,\operatorname{LOWPT2}(y)$ 的(可能为空的)树边的路径,我们可以形成违反引理 2 的三条路径,因此 $p$ 不能在左侧嵌入。 我们使用引理 9 来判定平面性,方法如下:首先,我们将环 $c$ 嵌入到平面中。然后,我们按照路径寻找中探索的顺序一次嵌入一个段。为了嵌入一个段 $S$,我们在其中找到一条路径,比如 $p$。我们选择从一边,比如从左边,嵌入 $p$。我们将 $p$ 与之前嵌入的 frond 进行比较,以确定 $p$ 是否可以嵌入。如果不能直接嵌入,我们将有阻挡 $p$ 的 frond 的段从左侧移动到右侧。如果 $p$ 可以在移动段后嵌入,我们就嵌入 $p$。但是,如果我们将段从左侧移动到右侧,我们可能需要将其它段从右侧移动到左侧。因此,可能无法嵌入 $p$。如果是这样,我们断言该图是非平面的。如果 $p$ 可以嵌入,我们基本上通过递归使用算法试图嵌入 $S$ 的其余部分。然后我们尝试嵌入下一个段。 我们需要一些好的数据结构来有效地实现这种方法。如果我们要嵌入一个从顶点 $v_i$ 开始的段,我们必须知道从 $1$ 到 $v_i$ 的树路径上的哪些顶点有从左侧或右侧进入的 frond。为此,我们使用两个栈($L$ 和 $R$)。栈 $L$ 将(按顺序)包含满足 $1\to^\ast v_k\to^\ast v_i$ 的 $v_i$,与一些从左侧嵌入的进入 $v_k$ 的 frond。$L$ 只需要为每个有一条指向 $v_k$ 的 frond 的段包含一次顶点 $v_k$,但有时同一个段中的两条 frond 可能会指向相同的顶点 $v_k$,这可能会导致 $v_k$ 在栈上出现两次,即使 $v_k$ 只代表一个段。栈 $R$ 对嵌入的在右侧嵌入 $c$ 的 frond 执行与 $L$ 相同的功能。 栈 $L,R$ 必须以四种方式更新: 1. 在探索并嵌入从 $v_{i+1}$ 开始的所有段后,必须删除 $L$ 和 $R$ 中出现的所有 $v_i$,因为尚未探索的段从不大于 $v_i$ 的顶点开始。这类更新需要删除 $L,R$ 顶部的一些元素。 2. 如果 $p:s\Rightarrow^\ast f$ 是段 $S$ 中的第一条路径,且 $p$ 是正常路径,则当嵌入 $p$ 时,必须将 $f$ 加入栈中。(由于 $s$ 位于 $c$ 上,$f>1$ 当且仅当 $p$ 是正常路径。)根据引理 9,当 $L(R)$ 上的每个顶点都不大于 $f$ 时,$p$ 只能嵌入到左侧(右侧),因此 $f$ 可以添加到 $L(R)$ 的顶部。 3. 该算法的递归应用必须为段 $S$ 中的其余路径添加元素。我们稍后将研究该算法的递归应用。 4. 随着段的移动,相应的元素必须从一个栈转移到另一个栈。比如从左侧嵌入一条 frond,由引理 2,这迫使同一个段中的 frond 嵌入左侧,并由引理 9,可能迫使其余段中的 frond 嵌入右侧。设 _块 / block_ $B$ 是 $L,R$ 上与 frond 对应的最大元素集,使得任何一个 frond 的位置都决定了所有其他 frond 的位置。块会随着栈的变化而变化,但块总是对栈元素进行分区。此外,这些块具有由下一个引理给出的简单结构。 引理 10。设 $B$ 为一个块。则 $B\cap L(B\cap R)$ 在 $L(R)$ 上相邻。且存在 $c$ 上的顶点 $v_j,v_k$ 满足对于 $v_l\in L\cap R$ 有: 1. 如果 $v_j<v_l<v_k$,则 $v_l\in B$。 2. 如果 $v_l<v_j$ 或 $v_l>v_k$,则 $v_l\notin B$。 证明。对嵌入的段的数量和从 $L,R$ 中删除的元素数进行归纳。在嵌入任何段之前,引理肯定是正确的,因为两个栈都是空的。如果引理在从 $L,R$ 的顶部删除所有 $v_i$ 前为真,那么引理在删除后肯定为真,因为从 $L,R$ 中删除 $v_i$ 只可能导致完整的块(仅由 $v_i$ 组成)被删除,并导致剩余的顶部块失去其顶部顶点的出现。 假设在嵌入段 $S$ 之前引理为真。设 $p:s\Rightarrow^\ast f$ 为 $S$ 中的第一条路径。假设 $S$ 嵌入到左侧。当与 $S$ 对应的元素被添加到 $L$ 中时,根据引理 9,这形成一个新的块 $B$,其中包含与 $S$ 对应的元素,还包含 $R$ 中具有满足 $f<v_l<S$ 的元素 $v_l$ 的所有旧块 $B$。设 $v_0$ 是任何这类块 $B$ 中的最小元素 $v_l$。其余旧块中的所有元素 $v_m$ 都满足 $v_m=\min(v_0,f)$。新块 $B'$ 由位于 $L,R$ 上的旧块以及位于 $L$ 上的与 $S$ 对应的新块组成。因此,块 $B'$ 满足 $v_j=\min(v_0,f)$ 和 $v_k=s$ 的引理。其他旧块保持不变。引理可由对嵌入的段的数量和从 $L,R$ 中删除的元素数进行归纳得到。 引理10表明了我们如何跟踪这些块。这些块为我们提供了足够的信息,可以轻松地将元素从一个栈移动到另一个栈。我们使用链表来存储 $L,R$。然后,为了在栈之间切换严肃块,我们只需要在块的开头和结尾切换链表指针。我们使用栈 $B$ 来跟踪块。$B$ 的每个元素代表一个块,是一个有序对 $(x,y)$,其中 $x$ 指向 $L$ 上最后一个块的元素,$y$ 指向 $R$ 上最后一个块的元素。如果 $x=0(y=0)$,则该块在 $L(R)$ 上没有元素。下面的过程实现了嵌入算法。第 $7$ 节详细介绍了必要的列表处理操作。 procedure EMBED; **begin**\ $\quad$**comment** routine to embed a properly ordered biconnected graph in the plane, if possible;\ $\quad$L := R := B := the empty stack;\ $\quad$find first cycle c;\ $\quad$**while** some segment is unexplored **do begin**\ $\qquad$initiate search for path in next segment S;\ $\qquad$when backing down tree arc $v\to w$ delete entries on L and R and blocks on B containing vertices no smaller than v;\ $\qquad$let $p:s\Rightarrow^\ast f$ be first path found in segment S;\ $\qquad$**while** position of top block determines position of p **do begin**\ $\qquad\quad$delete top block from B;\ $\qquad\quad$**if** block entries on left **then** switch block of entries from L to R and from R to L by switching list pointers;\ $\qquad\quad$**if** block still has an entry on left in conflict with p then go to nonplanar;\ $\qquad$**end**;\ $\qquad$**if** p is normal **then** add last vertex of p to L;\ $\qquad$add new block to B corresponding to p and blocks just removed from B;\ $\qquad$d: apply algorithm recursively to embed other paths in S;\ $\qquad$**comment** details of the recursive application are discussed later. After completion of this step, other paths in S which lead to ancestors of S will be represented on L. One new block corresponding to these paths will appear on B;\ $\qquad$combine top two blocks on B;\ $\quad$**end**;\ **end**; 引理 11。$G$ 是平面的当且仅当过程 EMBED 终止。否则,过程将分支到“非平面”位置。 证明。EMBED 是前面描述的算法的直接实现。在任何时候,栈 $L,R$ 都包含嵌入在环 $c$ 左右两侧的 frond 的元素,栈 $B$ 包含有关每个元素块结束的信息。引理 9 用于判定平面性,引理 10 用于在过程执行时修改块。假设步骤 d(算法的递归应用)正确实现,则可以通过归纳法直接证明在块中嵌入任何 frond 完全决定了块中所有 frond 的嵌入,以及从一个块中嵌入 frond 不会限制不在块中的 frond 的嵌入。根据引理 9 和 10,该程序正确地判定了平面性。 考虑在段中嵌入第二条和后续路径。假设环 $c$,$S$ 之前的所有段和 $S$ 中的第一条路径 $p:s\Rightarrow^\ast f$ 都已嵌入。很容易看出,当且仅当 $S,c$ 一起形成平面图时,$S$ 的其余部分才能被添加到嵌入中。(事实上,这是根据 Auslander 和 Parter 的结果 [1] 得出的。)图 7 显示了 $S,c$。路径 $p$ 和从 $f$ 到 $s$ 的树边路径形成了一个环 $c'$,用于递归应用嵌入算法。 ![](https://cdn.luogu.com.cn/upload/image_hosting/qcyeer6k.png) 在 EMBED 将 $p$ 嵌入左侧后,$L$ 上的顶部元素是 $f$。引理 5 中,$S$ 中的所有 frond 都指向不小于 $f$ 的顶点。假设我们在 $R$ 的顶部放置一个栈结束标记,并递归应用嵌入算法来确定循环 $c'$ 加上删除 $c'$ 时形成的 $S$ 中的段是否可以嵌入到平面中。如果递归成功完成,栈 $L,R$ 将包含与 $S$ 中正常路径的终止 frond 对应的元素,栈 $B$ 可能包含一些新块。当且仅当没有新块同时在 $R,L$ 上有元素时,环 $c$ 的其余部分可以添加到 $S,c'$ 的嵌入中。如果没有新块同时在 $R,L$ 上有元素,那么任何在 $R$ 上有元素的新块都可以移动到 $L$,结果是没有新块会在 $R$ 上有元素。 因此,为了完成对 $c,S$ 的平面性的判定,我们必须尝试将新块从 $R$ 移动到 $L$。要继续算法的顶级应用,我们必须将所有新块组合成一个与 $S$ 减去 $p$ 中的路径对应的块,并且必须删除 $R$ 上的栈结束标记。然后,$R$ 将被恢复,$L$ 将在 $L$ 的其余元素之上有 $S$ 中的 frond 元素,$B$ 将包含一个与 $S$ 减去 $p$ 中的 frond 对应的额外块。步骤 d 可以按如下方式实现: d: **comment** apply algorithm recursively to embed the rest of S;\ $\qquad$add end-of-stack marker to R;\ $\qquad$call embedding algorithm recursively;\ $\qquad$**for** each new block (x, y) on B **do begin**\ $\qquad\quad$**if** (x $\ne$ 0) and (y $\ne$ 0) **then go to** nonplanar;\ $\qquad\quad$**if** (y $\ne$ 0) **then** move entries in block to L;\ $\qquad\quad$delete (x, y) from B;\ $\qquad$**end**;\ $\qquad$delete end-of-stack marker on R;\ $\qquad$add one block to B to represent S minus path p; 引理 12。如果步骤 d 如上所述实现,则嵌入算法正确地测试了平面性。 证明。这个引理来自引理 11 和 Auslander 与 Parter 的结果,即 $S$ 加 $c$ 是平面的当且仅当 $S$ 减 $p$ 可以添加到平面嵌入中。$L,R,B$ 上的旧元素不会干扰算法的递归应用,因为 $R$ 中一个栈结束标记,$L$ 上的所有元素都不大于 $f$。当递归应用完成时,$L,R,B$ 上的信息正是继续顶级算法的应用所需的信息。图 8 显示了当嵌入算法应用于图 5 中的图时,栈 $L,R,B$ 的内容。第 7 节详细给出了完整的嵌入算法。 ![](https://cdn.luogu.com.cn/upload/image_hosting/hpjmnrvq.png) ### 7. 完整的路径嵌入算法 由于路径是在找到时嵌入的,因此嵌入算法可以与路径选择算法相结合。完整的实现如下。详细实现了涉及 $L,R$ 的步骤,使算法的运行时间很明显。 ![](https://cdn.luogu.com.cn/upload/image_hosting/2ij5fin4.png) ![](https://cdn.luogu.com.cn/upload/image_hosting/svn0q6pr.png) 引理 13。EMBED 正确地判定了图 $G$ 的平面性。 证明。EMBED 是第 5 节和第 6 节中描述的寻路和嵌入算法的直接实现。 引理 14。EMBED 需要 $O(V+E)$ 时间来判定具有 $V$ 个顶点和 $E$ 条边的图。 证明。算法的路径寻找部分需要 $O(V+E)$ 时间,如第 5 节所述;这是一种深度优先搜索,需要进行一些额外的计算。算法的嵌入部分使用的关于路径的唯一信息是路径的端点。算法的嵌入部分由一系列栈操作组成。向栈中添加元素或从栈中删除元素需要常数时间。(任何给定的此类操作的确切步骤数可以通过检查程序来确定。)栈 $L,R,B$ 上的元素总数为 $O(V+E)$,因为路径的数量为 $E-V+1$。因此,栈计算需要 $O(V+E)$ 时间。初始化需要常数时间,因此整个算法需要 $O(V+E)$ 时间。 引理15。平面性算法需要 $O(V)$ 时间来判定具有 $V$ 个顶点的图的平面性。 证明。如果 $G$ 的边数超过 $3V-3$,则算法停止,因此计数边需要 $O(V)$ 时间。如果 $G$ 有 $O(V)$ 条边,则初始深度优先搜索需要 $O(V)$ 时间,使用 LOWPT 值对边进行排序需要 $O(V)$ 时间,路径查找/嵌入算法需要 $O(V)$ 时间。因此,总时间为 $O(V)$ 。也很容易看出,该算法需要 $O(V)$ 存储空间。 ### 8. 实现与实验 不重要。 ### 9. 应用与结论 这里描述的平面性算法判定图 $G$ 的平面性,但该算法实际上并没有构造 $G$ 的平面表示。然而,该算法收集了足够的信息,使构造平面表示变得容易,并且可以稍微修改该算法以执行此步骤。实现这一点的一种方法是构建 _依赖图 / dependency graph_ $D$。依赖图的顶点将对应于 $G$ 中的路径。如果一条路径的位置决定了另一条路径,则两条路径将由一条边连接。边有两种类型,具体取决于路径必须嵌入在对应的环的同一侧还是相反侧。满足边约束的方式用两种颜色对 $D$ 的顶点进行着色对应于 $G$ 的嵌入。有关详细信息,请参见 [29]。图 9 显示了图 3 和图 5 中的依赖关系图和图的嵌入。很容易修改嵌入算法,使其构建并着色依赖图。这种修改后的算法可用于完成电子电路板布局等任务。 ![](https://cdn.luogu.com.cn/upload/image_hosting/2d29tto8.png) 平面性算法可以与用于确定图的连通性的算法 [5, 6, 8] 相结合,并与 Hopcroft 的算法 [15, 17] 相结合,以判定三连通平面图的同构性,从而给出一种用于确定两个任意平面图是否同构的算法 [7, 16]。该算法需要 $O(V\log V)$ 时间和 $O(V)$ 空间。该算法有望对化学家有价值,因为大多数分子都可以表示为平面图。根据同构算法得出的分子规范形式可用于加快化学文献的搜索速度。该算法也可用于枚举各种类型的平面图。(例如,参见 Grace [43]。) 平面性算法和其他使用深度优先搜索的算法说明了该技术作为一种高效、系统的图形探索方法的价值。平面性算法也说明了精心选择的数据结构的价值。这些想法可以在解决许多其他问题的高效算法中得到应用。 \operatorname{LOWPT1} ## 支持平面图 Fáry 嵌入的小集合 ### 摘要 回答了 Rosenstiehl 与 Tarjan 的问题,我们证明了任意 $n$ 个顶点的平面图都有一个 $2n-4$ 乘 $n-2$ 网格中的 Fáry 嵌入(即,直线嵌入)并且提供了一个 $O(n)$ 空间、$O(n\log n)$ 时间的算法来产生这样的嵌入。另一方面,我们证明了,对于任意能支持每个大小 $n$ 的平面图的 Fáry 嵌入的集合 $F$,大小至少为 $n+(1-o(1))\sqrt n$,解决了 Mohar 问题。 ### 1. 引言 I. Fáry [F] 的定理表明:所有平面图都存在点在平面上、边是平面上直线的嵌入。这类嵌入称作 Fáry 嵌入。从 Tutte 1963 年的论文开始,已经有了许多构造 Fáry 嵌入的算法([T], [CYN], [Rd])。现在的所有寻找平面图 Fáry 嵌入的算法都有一些缺陷。这些缺陷是(1)这些算法需要与图大小相关的高精度实数计算与(2)顶点趋向于聚在一起,顶点间最小距离与最大距离的比值非常小。这意味着:(1)对于一个中等大小的图,都不可能运行这个算法且(2)即使可以,也不可能在终端屏幕上展示得到的结果。 实际上,确定是否存在固定的 $k$,使得任何一个大小为 $n$ 的平面图可以 Fáry 嵌入到边界长度被 $n^k$ 限定的网格中是一个仍未解决的问题 [RT]。类似这样关于平面图能被多紧凑地嵌入到网格中的问题,与 VLSI 布局设计问题相关([L], [U], [V])。定理 1 对这个问题给出了一个肯定回答,其证明给出了一个构造这类嵌入的算法。 定理 1。任何 $n$ 个点的平面图都有 $2n-4$ 乘 $n-2$ 网格上的 Fáry 嵌入。 可以证明,一个 $\dfrac n3$ 个三角形组成的交错序列在网格上的 Fáry 嵌入至少需要大小为 $\left(\dfrac23n-1\right)\times\left(\dfrac23n-1\right)$ 的网格。 因为 Hopcroft-Tarjan 平面图判定算法 [HT] 给出了一个平面图的拓扑嵌入,我们将假设我们考察的所有图都已经通过了检测,并且具有一个这样的嵌入。一个 _极大_ 平面图是不能加入任何不破坏其平面性的附加边的图。这样的图被称为 _三角化图_ 因为图中所有的面都是三角形。因为每个平面图都可以通过加入附加的(无用的)边进行三角化,对所有极大平面图证明定理 1 就足够了。 我们通过提供一个输入任意极大平面图、任意三角面,输出以给定三角形为外边界的嵌入的算法在 Section 3 中证明定理 1。我们的证明基于被称为 _平面图的典范表示_ 的通用构造(Section 2),该表示提供了一个合适的顶点顺序,使得我们可以归纳地将前 $k$ 个顶点的导出子图嵌入网格中,然后通过以受控的方式移动嵌入中的一些顶点,我们可以添加下一个顶点,并且仍然拥有 Fáry 嵌入。表面上开,这个算法至少是平方时间复杂度的。将算法加速到 $O(n\log n)$ 的方法是:不实际进行每次嵌入,而是将所需的所有信息存储在一个排列里,我们可以在 $O(n\log n)$ 时间内构造这个排列。然后我们会进行 $O(n)$ 次关于排列的询问:对于下标 $i,j$,有多少个排列中的 $k$ 满足 $i\le k\le j,p_k<p_i$。这些询问的答案将被用来找到嵌入顶点的坐标。这些询问可以被表示为对 $2n$ 个点的矩形范围查询,这些点是从排列中导出的,并使用 Chazelle [C] 的数据结构,该数据结构使用线性空间,$O(n\log n)$ 预处理时间,每个查询都可以在时间 $O(\log n)$ 内执行。 平面图的典范表示是一个有用的证明带有便于归纳论证的特殊的几何性质的 Fáry 嵌入存在性的工具。命题 1 2 3 是几个例子。 命题 1。给定极大平面图 $G$ 与一个面 $uvw$,存在顶点的标号方式,$v_1=u,v_2=v,v_3,\dots,v_n=w$ 与 Fáry 嵌入 $f$ 使得对于 $k=4,\dots,n$ 有 $\{f(v_1),f(v_2),f(v_3),\dots,f(v_k)\}$ 的凸包与 $\{f(v_1),f(v_2),f(v_k)\}$ 的凸包相同。 命题 2。给定极大平面图 $G$ 与一个面 $uvw$,存在顶点的标号方式,$v_1=u,v_2=v,v_3,\dots,v_n=w$ 与一个 Fáry 嵌入 $f$ 使得对于 $k=4,\dots,n$ 有 $\{f(v_1),f(v_2),f(v_3),\dots,f(v_k)\}$ 的凸包与 $\{f(v_{k-2}),f(v_{k-1}),f(v_k)\}$ 的凸包相同。 命题 3。给定极大平面图 $G$ 与一个面 $uvw$,存在顶点的标号方式,$v_1=u,v_2=v,v_3,\dots,v_n=w$ 与一个 Fáry 嵌入 $f$ 使得对于 $k=4,\dots,n$ 有 $\{f(v_1),f(v_2),f(v_3),\dots,f(v_k)\}$ 的凸包的边界是一个 $G$ 中的环,且 $f(v_{k+1})$ 不包含在 $\{f(v_1),f(v_2),f(v_3),\dots,f(v_k)\}$ 的凸包中。 定理 1 给出了可支持大小为 $n$ 的平面图的最小网格大小的渐进紧边界。即使网格是自然的嵌入图的集合,取消网格的限制,寻找支持所有大小为 $n$ 的平面图的集合的大小的界也是有意义的。去年,Bojan Mohar [M] 问是否存在平面上 $n$ 个点的支持所有 $n$ 个顶点的平面图的集合(一个集合 $F$ _支持_ 一个简单平面图,如果存在单射 $f:V(G)\to F$ 使得如果 $[a,b],[c,d]$ 是 $G$ 的边,线段 $[f(a),f(b)]$ 与 $[f(c),f(d)]$ 开不相交)。对于一个平面图的集合,$F$ 被称为 _通用的_,如果其支持集合中的所有图。因此由 Fáry 定理,$\mathbb R^2$ 关于所有平面图是通用的,由定理 1,$n-2$ 乘 $2n-4$ 网格关于所有 $n$ 个顶点的平面图是通用的。Mohar 问是否存在一个大小为 $n$ 的集合关于 $n$ 个点的所有平面图通用。 我们在 Section 5 中对此问题给出否定回答,我们证明了: 定理 2。如果 $F$ 关于所有 $n$ 个顶点的平面图通用,那么 $|F|>n+(1-o(1))\sqrt n$。 ### 2. 平面图的典范表示 本节的目的是描述构造平面图的典范方法,这将是我们在本文其余部分研究的基本工具,并且还提供了 Fáry 定理推广(命题 1.2 和 3)的简单证明。 下面的简单观察对我们的目标至关重要。 引理。设 $G$ 是一个嵌入到平面中的简单平面图,$u=u_1,u_2,\dots,u_k=v$ 为 $G$ 的环。则存在环上不同于 $u,v$ 的顶点 $w'$(相应的,$w''$)不与任何内弦(相应的,外弦)相邻。 证明。如果一个环没有任何内弦(相应的,外弦),那么证明完成。否则,设 $(u_i,u_j),j>i+1$ 为 $j-i$ 最小的内弦(外弦)。则由极小性,$u_{i+1}$ 不与任何环 $u_i,u_{i+1},\dots,u_j$ 上的内弦相邻。由平面性,这个点不能与原始环的任何内弦(外弦)相邻。$\quad\Box

弦是环中连接两个不相邻顶点的边。

顶点与边相邻的意思是顶点为边的一个端点。

现在我们可以证明如下引理

平面图的典范表示引理。设 G 是嵌入到平面中的极大平面图,其外边界为三角形 u,v,w。则存在顶点的标号方式 v_1=u,v_2=v,v_3,\dots,v_n=w 对于任意 4\le n\le n 满足下面的要求。

(i) v_1,v_2,\dots,v_{k-1} 的导出子图 G_{k-1}\subseteq G 是 2-连通图,其外部面的边界是包含边 uv 的环 C_{k-1}

(ii) v_kG_{k-1} 的外部面中,其在 G_{k-1} 中的相邻节点形成了路径 C_{k-1}-uv(至少 2 个元素)的子区间(见图 1)。

证明。顶点 v_n,v_{n-1},\dots,v_3 将由反向归纳法定义。

v_n=w。设 G_{n-1}G 删除 v_n 后的子图。由 G 的极大性,w 的相邻节点构成包含 uv 的环 C_{n-1},这个环是 G_{n-1} 外部面的棉结。

i<n 为一固定整数,设对于任何 k>iv_k 已被确定,使得 V(G)\backslash\{v_k,v_{k+1},\dots,v_n\} 的导出子图 G_{k-1} 满足条件 (i) 与 (ii)。设 C_{k-1}G_{k-1} 的外部面的边界。将引理应用到 G_i 中的环 C_i,我们得到存在一个不同于 u,v 的顶点 w'\in C_i 与任何 C_i 的弦都不相邻(观察到 C-i 没有外弦)。设 v_u=w'V(G)\backslash\{v_i,v_{i+1},\dots,v_n\} 的导出子图显然满足要求。\quad\Box

命题 1 现在几乎立即成立。

命题 1 的证明。设 v_1=u,v_2=v,v_3,\dots,v_n=w 为图 G 的如上所述的典范标号。我们将通过 k 上的归纳定义 f(v_k),1\le k\le n

f(v_1)=(0,0),f(v_2)=(2,0),f(v_3)=(1,1)。假设 f(v_i),1\le i<k 全部被确定,使得 fG_{k-1} 的 Fáry 嵌入,且满足:

\forall3\le i<k:\operatorname{conv}\{f(v_1),f(v_2),\dots,f(v_i)\}=\operatorname{conv}\{f(v_1),f(v_2),f(v_i)\}

我们想将其扩展为 G_k 的嵌入。

u=w_1,w_2,\dots,w_m=v 表示 C_{k-1} 的顶点,以其在 G_{k-1} 外部面边界上出现的顺序排序。设 x(w_j),y(w_j) 分别表示 f(w_j)x 坐标与 y 坐标。由归纳进行假设,

\begin{cases}x(w_1)<x(w_2)<\cdots<x(w_m)\\\forall3\le j\le m:y(w_j)>0\end{cases}\tag{\text iii}

由典范标号的性质 (ii),存在 1\le p<q\le m 使得 v_kw_p,w_{p+1},\dots,w_q 相邻。

x(w_p),x(w_q) 间固定一个整数 x^*,令 f(v_k)=(x^*,y^*),其中 y^*>0。显然,如果 y^* 足够大,我们就得到 G_k 的满足要求性质的 Fáry 嵌入。更进一步,我们的辅助性质 (iii) 对 C_k 的顶点也成立。\quad\Box

命题 2 3 可以以类似方式证明。

3. 在网格上绘制平面图

只需要对极大平面图证明定理 1。设 G 是外部面为 u,v,w 的图,令 v_1=u,v_2=v,v_3,\dots,v_n=wG 顶点的典范标号。

证明的想法如下。假设在我们算法的第 k 步,G_k 已被 Fáry 嵌入到网格中,使得

(1) v_1 位于 (0,0)v_2 位于 (2k-4,0); (2) 如果 v_1=w_1,w_2,\dots,w_m=v_2G_k 的外部面上的顶点(以出现顺序排列),设 x(w_i) 表示 w_ix 坐标,则

x(w_1)<x(w_2)<\cdots<x(w_m)

(3) 边 [w_i,w_{i+1}],1\le i<m 的斜率都是 \pm1

注意性质 (3) 蕴含任意两个外部面的顶点 w_i,w_j 的 Manhattan 距离是偶数((x,y),(x',y') 的 Manhattan 距离为 |x-x'|+|y-y'|)。因此,如果 i<j,通过点 w_i 的斜率为 +1 的直线与通过点 w_j 斜率为 -1 的直线是格点,称为 P(w_i,w_j)

w_p,w_{p+1},\dots,w_qv_{k+1}G_{k+1} 中的相邻节点(1\le p<q\le m)(参见典范表示引理的第 2 部分)。那么 P(w_p,w_q) 是一个放置 v_{k+1} 的良好的坐标,除了这个位置可能看不到一些点,例如 w_p(见图 2)。

为确保 P(w_p,w_q) 能看到 w_p,w_{p+1},w_q 中所有点,我们将嵌入变形,使得线段 [w_p,w_{p+1}] 的斜率 <1,线段 [w_{q-1},w_q] 的斜率 >-1,而 G_k 外部面上其它边的斜率保持不变。一种方法是将 w_{p+1},w_{p+2},w_m 向右移动 1 单位,然后将 w_q,w_{q+1},w_m 再次向右移动 1 单位。但是,为了保证这仍然是一个 Fáry 嵌入,可能需要移动其它顶点(不在外部面上)。尽管很难全局地知道哪一组点必须与给定的外部顶点一起移动,但有一种优雅的方法可以在算法的每一步递归地定义这样的点集。

为了实现这个目标,假设对于每个 G_k 的外部面上的顶点 w_i,我们已经定义了一个子集 M(k,w_i)\subseteq V(G_k) 满足:

(a) w_j\in M(k,w_i)\iff j\ge i

(b) M(k,w_1)\supset M(k,w_2)\supset\cdots\supset M(k,w_m)

(c) 对于任意非负整数 \alpha_1,\alpha_2,\dots,\alpha_m,如果按顺序将 M(k,w_i) 中的顶点按顺序向右移动 \alpha_i 距离(i=1,2,\dots,m),且 G_k 的嵌入仍然是 Fáry 嵌入。(注意许多顶点会被移动多次;例如,所有 M(k,w_i)\backslash M(k,w_{i+1}) 中的点将移动 \alpha_1+\alpha_2+\cdots+\alpha_i 单位)。

对于 k=3,Fáry 嵌入 v_1\to(0,0),v_2\to(2,0),v_3\to(1,1) 与集合 M(3,v_1)=\{v_1,v_2,v_3\},M(3,v_2)=\{v_2,v_3\},M(3,v_3)=\{v_3\}

在条件 (c) 中代入 \alpha_{p+1}=\alpha_q=1,其余 \alpha_i=0,我们可以找到 G_k 的新 Fáry 嵌入。w_pw_q 的新位置的 Manhattan 距离仍然是偶数,因此我们可以将 v_{k+1} 放置于经过 w_p 斜率为 +1 的直线与经过 w_q 新位置斜率为 -1 的直线的交点。显然关于 G_{k+1} 的新嵌入满足条件 (1) (2) (3)(见图 3)。

$$u=w_1,w_2,\dots,w_p,v_{k+1},w_q,\dots,w_m=v$$ 对序列的任意元素 $z$ 我们必须定义一个集合 $M(k+1,z)\subseteq V(G_{k+1})$。设 $$M(k+1,w_i)=M(k,w_i)\cup\{v_{k+1}\},i\le p$$ $$M(k+1,v_{k+1})=M(k,w_{p+1})\cup\{v_{k+1}\}$$ $$M(k+1,w_j)=M(k,w_j),j\ge q$$ 显然,由归纳,这些集合满足性质 (a) (b)。 为检查性质 (c) 仍然为真,取非负整数序列 $\alpha(w_1),\dots,\alpha(w_p),\alpha(v_{k+1}),\alpha(w_q),\dots,\alpha(w_m)$。对于 $G_{k+1}$ 外部面上的所有 $z$,将集合 $M(k+1,z)$ 中所有集合向右移动 $\alpha(z)$ 距离。注意到移动后 $G_{k+1}$ 低于多边形 $w_1w_2\dots w_m$ 的部分(即 $G_k$)仍然是 Fáry 嵌入的(将 $\alpha_1=\alpha(w_1),\dots,\alpha_p=\alpha(w_p),\alpha_{p+1}=1+\alpha(v_{k+1}),\alpha_q=1+\alpha(w_1),\alpha_{q+1}=\alpha(w_{q+1}),\dots,\alpha_m=\alpha(w_m)$,其余 $\alpha_i=0$ 带入 (c))。另一方面,很容易发现,因为移动过程中 $w_{p+1},w_{p+2},\dots,w_{q-1},v_{k+1}$ 的导出子图移动时相对位置不变($\alpha(w_1)+\cdots+\alpha(w_p)+\alpha(v_{k+1})$ 单位距离),所以 $G_{k+1}$ 在 $w_1w_2\dots w_m$ 上的部分(即,$v_{k+1}$ 与 $G_k$ 的上轮廓)仍然是 Fáry 嵌入。 我们算法的输出是 $G_n=G$ 的满足条件 (1) (2) (3) 的 Fáry 嵌入,其中 $k=n$。这立即表明 $G$ 的每个点都嵌入到由 $f(v_1)=f(u)=(0,0),f(v_2)=f(v)=(2n-4,0),f(v_n)=f(w)=(n-2,n-2)$ 围成的三角形内部的格点上。这完成了定理 1 的证明。$\quad\Box

在网格上绘制平面图的 O(n\log n) 算法的概述

给定平面图 G,假定 G 是极大的,因为,在线性时间内可以添加无用边使其变为极大的 [Rd]。我们进一步标记顶点:(a) 没有被访问过 (b) 访问一次 (i) 访问多于一次且访问边形成 i 个连通分量,以与顶点相邻的边的环形顺序排列。当我们选择顶点 v_{k+1} 时更新标记。我们访问 v_{k+1} 的每个相邻节点。假设 v 是这些顶点其中之一。如果 v 有标记 (a),将其替换为标记 (b)。如果 v 有标记 (b) 且从 v_{k+1} 出发的边与 v 的边按照环形顺序的访问的前一条边相邻,将标记 (b) 替换为 (1),否则,将其替换为 (2)。最终,如果 v 有标记 (j),从 v_{k+1}v 的边的左、右相邻边都被穿过,那么用标记 (j-1) 取代标记 (j)。如果这些边中只有一条被经过,那么用标记 (j+1) 取代标记 (j)。显然 v 上标记 (j) 的含义是已经遍历的 v 的入边中由 v 处边的环形顺序的 j 个区间组成。容易发现任何有 (1) 标记的顶点都可以被选作 v_{k+2}。因为边的数量是线性的,我们可以在线性时间内找到插入顶点的顺序。

我们归纳定义一个排列。首先 \pi_2=(1,2)。然后假设 \pi_k 已被定义,且 v_k 与(以逆时针顺序)与 G_k 中的顶点 v_{i_1},v_{i_2},\dots,v_{i_j} 相邻。那么我们在排列 \pi_k 中将 k+1 插入 i_2 的左侧,将 n+k+1 插入 i_j 的右侧,生成排列 \pi_{k+1}。显然 \pi_n 可以在 O(n\log n) 时间内构造。显然,设顶点 v_j 的下标为 j,则

\begin{aligned}M(k,v_i)&=\{j|j\le n,j\text{ does not precede }i\text{ in }\pi_k\}\\&=\{j|i\le j\le n,j\text{ does not precede }i\text{ in }\pi_k\}\end{aligned}

假设 v_k 位置为 (x_k(j),y_k(j)),且 v_j 在网格上,则 y_k(j)=y_k(k),x_k(j)=x_k(k)+\sigma(k,j) 其中:

\begin{aligned}\sigma(k,j)&=|\{i|k<i,i\text{ precedes }k\text{ in }\pi_j\}|\\&=|\{i|k<i\le j,,i\text{ precedes }k\text{ in }\pi_n\}|\end{aligned}

由此,如果我们对于 v_jv_jG_{k-1} 中最左侧的相邻节点 v_k 与最右侧的相邻节点 v_k 给定 (x_j(j),y_j(j)),\sigma(j,k),那么我们能在常数时间内找到 v_k 的嵌入坐标 (x_k(n),y_k(n))。因此,整个算法的时间复杂度为 O(nT),其中 T 为计算 \sigma(j,k) 的时间复杂度,最终,令 S 为点的集合

\{(1,1),(2,2n-3)\}\cup\{(k,\pi_n^{-1}(k)),(k,\pi_n^{-1}(n+k))|3\le k\le n\}

显然 \sigma(k,j)=|S\cap R(k,j)| 其中 R(k,j) 是矩形

R(k,j)=\{(x,y)|k+1\le x\le j,1\le y\le\pi_n^{-1}(k)\}

因此由 [C] 可得 T=\log n\quad\Box

5. 支持所有平面图的集合的大小的下界

G_k 为有 k 个顶点 2k-4 个三角面的极大平面图。给定任意自然数 n_i,1\le i\le2k-4\sum_{i=1}^{2k-4}n_i=n-k。设 G_k(n_1,n_2,\dots,n_{2k-4}) 为顶点 \{P_1,P_2,\dots,P_n\} 的极大平面图,其中 \{P_1,P_2,\dots,P_k\} 的限制是 G_k 且面 f_i 中有 n_i 个顶点。因为 G_k,G_k(n_1,n_2,\dots,n_{2k-4}) 是极大的,由 Steinitz 定理,这些图有唯一的平面映射。假设 F\mathbb R^2 的一个支持所有这样的图的子集,对每一个这样的图固定一个嵌入 f_G:V(G)\to F。至多存在 |F|^k 种方式来嵌入 (P_1,P_2,\dots,P_k),因此至少 \dbinom{n+k-5}{2k-5}/|F|^k 张这样的图在顶点 \{P_1,P_2,\dots,P_k\} 上相同。另一方面,FG_k 的一个给定的嵌入可以被拓展为至多 \dbinom{|F|-n+2k-5}{2k-5} 张这样的图。因此

\binom{|F|-n+2k-5}{2k-5}>\binom{n+k-5}{2k-5}/|F|^k

由此,通过简单的计算我们有

\left(\dfrac{(|F|-n+2k)^2}n\right)^k\left(\dfrac{|F|}n\right)^k>n^{-5}\left(1-\dfrac kn\right)^{2k}

现在选择 k=\dfrac\epsilon4\sqrt n,对于充分大的 n,我们得到 |F|<n+(1-\epsilon)\sqrt n 是错误的,因此定理 2 成立。\quad\Box

6. 评论

Nejia Assila 实现了定理 1 证明中隐含的算法,以及在插入时可能是水平的外表面上引入新边的算法,而不是坚持这些边具有斜率 1-1。第二个版本的优点是,图可以 Fáry 嵌入到相当小的网格中。图 4a 与 4b 展示了每个算法在相同的图上的输出。

最后,我们怀疑存在一种线性时间算法,可以在线性大小的网格上构造任何平面图的 Fáry 嵌入。一个较弱但同样重要的问题是,该算法是否可以动态改进。在给定嵌入的情况下,是否有可能在线性时间内插入一个新顶点?

7. 致谢

懒得翻。

参考文献

[C] B. CHAZELLE. Slimming down searching structures functional approach to algorithm design, in Proceedings of the Twenty Sixth Annual Symposium on the Foundations of Computer Science. 1985, pp. 165-174.

[CYN] N. CHIRA, T. YAMANOUCHI, AND T. NISHIZEKI. Linear algorithms for convex drawings of planar graphs, in Progress in graph theory, 1982, pp. 153-173.

[Dea] P. DUCHET, Y. HAMIDOUNE, M. LAS VERGNAS, AND H. MEYNIEL. Representing a planar graph by vertical lines joining different intervals. Discrete Math., 46 (1983), pp. 319-321.

[F] I. FÁRY. On straight line representing of planar graphs. Acta. Sci. Math. (Szeged), 11 (1948). pp. 229-233.

[dF] H. DE FHAYSSEIXl. Drawing planar and non-planar graphs from the half-edge code, (to appear).

[dFR1] H. DE FHAYSSEIXl AND P. ROSENSTIEHL. Structures combinatoires pour traces automatiques do resaux, in Proceedings of the Third European Conference on CAD CAM and Computer Graphics, 1984, pp. 332-337.

[dFR2] H. DE FHAYSSEIXl AND P. ROSENSTIEHL. L'algorithme Gauchedroite pour le plongement des graphes dans le plan, (to appear).

[G] D.H. GREENE, Efficient coding and drawing of planar graphs, Xerox Palo Alto Research Center. Palo Alto, CA.

[Gr] G. GRÜNBAUM, Convex Polytopes, John Wiley.

[HT] J. HOPCROFT AND R. TARJAN. Efficient planarity testing, J. Comput. Mach., 21 (1974), pp. 549-568.

[L] F. T. LEIGHTON, Complexity Issues in VLSI, The MIT Press.

[M] B. MOHAR, private communication.

[OvW] R. H. J. M. OTTEN AND J. G. Van WIJK. Graph representation in interactive layout design, in Proceedings of the IEEE International Symposium on Circuits and Systems, 1978, pp. 914-918.

[R] P. ROSENSTIEHL. Embedding in the plane with orientation constraints. Ann. N. Y. Acad. Sci. (to appear).

[Rd] R. C. READ. A new method for drawing a planar graph given the cyclic order of the edges at each vertex. Congresus Numerantium. 56. pp. 31-44.

[RT] P. ROSENSTIEHL. AND R. E. TARJAN. Rectilinear planar layouts and bipolar orientations of planar graphs. Disc. Comp. Geom., 1 (1986), pp. 343-353.

[TT] R. TOMMASIA AND I. G. TOLLIS. A unified approach to visibility representations of planar graphs. Disc. Comp. Geom., 1 (1986), pp. 321-341.

[T] W. T. TUTTE. How to draw a graph. Proc. London Math. Soc., 13 (1963). pp. 743-768.

[U] J. D. ULLMAN, Computational Aspects of VLSI, Computer Science Press.

[V] L. G. VALIANT. Universality considerations in VLSI circuits. IEEE Trans. on Computers. C-30. pp. 135-140.

[W] D. R. WOODS. Drawing planar graphs. in Report N. STAN-CS-82-942, Computer Science Department. Stanford University, CA. 1981.