无向图转换为树

时间:2011-11-06 05:09:49

标签: graph tree graph-theory nodes

给定一个undirected graph,其中每个节点在空间中具有一般树形状的笛卡尔坐标,是否有算法将图形转换为树,并找到合适的根节点?

请注意,我们对“树”的定义要求分支在锐角处不会偏离父节点。

请参阅下面的示例图表。我们如何找到红色节点?

Example input graph Example output tree

2 个答案:

答案 0 :(得分:10)

这是一个关于如何解决问题的建议。

先决条件

  • 表示法:
    • g图表,g.v图顶点
    • v,w,z:个别顶点
    • e:个人优势
    • n:顶点数
  • 无向树g和给定节点g.v的任何组合唯一地确定具有根g.v的有向树(可通过归纳证明)

主意

  • 通过g隐含的有向树中的方向补充g的边缘,并通过g节点处的本地计算补充尚未找到的根节点。 / LI>
  • 这些方向将代表节点之间的子父级关系(v -> wv子级,w父级。
  • 完全标记的树将包含一个具有outdegree 0的唯一节点,这是所需的根节点。最终可能会有0个或多个根节点。

算法

假设图形/树结构的标准表示(例如邻接列表)

  1. g.v中的所有顶点最初都标记为未访问,未完成。
  2. 以任意顺序访问所有顶点。跳过标记为“已完成”的节点 让v成为当前访问的顶点。

    • 2.1扫描顺时针连接v的所有边缘,从边缘角度e_0的随机选择的e_0开始。
    • 2.2。定向相邻边e_1=(v,w_1), e_2(v,w_2),包围锐角 相邻:wrt根据它们与e_0包围的角度进行排序。

      [注意:不保证存在这样的一对,见第2条评论和最后评论。如果没有锐角,请在2.下一个节点处继续。 ]

      • 2.2.1已知边e_1, e_2的方向:

        • w_1 -> v -> w_2:不可能,因为祖父母 - 儿童片段会包含锐角
        • w_1 <- v <- w_2:不可能,同样的原因
        • w_1 <- v -> w_2:不可能,树中没有outdegree&gt; 1的节点

        • w_1 -> v <- w_2
          只有可能的一对方向。 e_1, e_2之前可能已被定位。如果先前的方向违反了当前的分配,则问题实例没有解决方案。

      • 2.2.2此赋值意味着子图上的树结构由w_1w_2)在不包含e_1 ( e_2`的路径上可到达的所有顶点引起。将两个诱导子树中的所有顶点标记为已完成

        [注意:子树结构可能违反了角度约束。在这种情况下,问题没有解决方案。 ]

    • 2.3标记v已访问过。在顶点v完成步骤2.2后,检查连接尚未指定方向的边的数量nc

      • nc = 0:这是您一直在寻找的根 - 但您必须检查解决方案是否与您的约束兼容。
      • nc = 1:将此边缘设为(v,z)        当你在树中时,这条边的方向是v-> z。将v标记为已完成。

        • 2.3.1检查z是否标记为已完成。             如果不是,请检查连接nc2的无定向边的数量z。                 nc2 = 1:将z用于v,重复步骤2.3。
  3. 如果您还没有找到根节点,则您的问题实例不明确: 随意定向剩余的无定向边缘。

  4. 备注

    1. 终止: 每个节点最多访问4次:

      • 每步2次
      • 每步最多两次2.2.2
      • 每步最多一次2.3
    2. 正确性:

      • 包围锐角的所有边缘均按步骤2.2.1
      • 定向
    3. 复杂性(时间):

      • 访问每个节点:O(n);
      • 顺时针扫过连接给定顶点的所有边需要对这些边进行排序 因此,您需要在约束O( sum_i=1..m ( k_i * lg k_i ) )下的m <= n个顶点sum_i=1..m k_i = n O ( n * lg n)

        总共需要sum_i=1..m ( k_i * lg k_i ) <= n * lg nsum_i=1..m k_i = nm <= n O(n)任意O(n)(可通过应用拉格朗日优化来证明)。

        [注意:如果你的树有一个由常数限定的度数,理论上你会在每个受影响的节点上按时间排序;在这种情况下的总计:O(n * lg n)]

      • 子树标记:
        如果实现为dfs,则通过此过程最多访问图中的每个节点2次。因此,调用此子例程的总计为O(n)

        总计:{{1}}

    4. 复杂性(空间):

      • {{1}}用于排序(顶点度不是常量限制的)。
    5. 问题可能不明确:

      • 多种解决方案:例如施泰纳树
      • 没有解决方案:例如形状像双尖箭头(&lt; - &gt;)
      • 的图形

答案 1 :(得分:0)

一个简单的解决方案是在红色节点或节点中心周围定义一个2d矩形,并用摩尔曲线计算每个节点。摩尔曲线是一个空间填充曲线,更多的是希尔伯特曲线的特殊版本,其中起点和终点相同,坐标位于2d矩形的中间。在一般情况下,您的问题看起来像是一个离散的寻址空间问题。