Graph 无向图到树的转换

Graph 无向图到树的转换,graph,tree,graph-theory,nodes,Graph,Tree,Graph Theory,Nodes,给定一个节点在空间中有一个笛卡尔坐标,该坐标具有树的一般形状,是否有一种算法将图形转换为树,并找到合适的根节点 请注意,我们对“树”的定义要求分支不以锐角从父节点发散 请参见下面的示例图。我们如何找到红色节点 这里有一个关于如何解决您的问题的建议 先决条件 符号: g图形,g.v图形顶点 v、w、z:单个顶点 e:单个边缘 n:顶点数 无向树g和给定节点g.v的任意组合唯一地确定根为g.v的有向树(可通过归纳证明) 主意 通过g所暗示的定向树中的方向来补充g的边,并通过g节点处的局部

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

请注意,我们对“树”的定义要求分支不以锐角从父节点发散

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


这里有一个关于如何解决您的问题的建议

先决条件
  • 符号:
    • g
      图形,
      g.v
      图形顶点
    • v、w、z
      :单个顶点
    • e
      :单个边缘
    • n
      :顶点数
  • 无向树g和给定节点g.v的任意组合唯一地确定根为g.v的有向树(可通过归纳证明)
主意
  • 通过
    g
    所暗示的定向树中的方向来补充
    g
    的边,并通过
    g
    节点处的局部计算来补充尚未找到的根节点
  • 这些方向将表示节点之间的子-父关系(
    v->w
    v
    child,
    w
    parent)
  • 完全标记的树将包含一个outdegree为0的唯一节点,它是所需的根节点。最终可能会有0个或多个根节点
算法 假设图形/树结构的标准表示形式(例如邻接列表)

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

    • 2.1从随机选择的
      e_0
      开始,顺时针扫描连接
      v
      的所有边,扫描顺序为
      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一个简单的解决方案是围绕红色节点或节点中心定义一个二维矩形,并使用摩尔曲线计算每个节点。穆尔曲线是一个空间填充曲线,更多的是希尔伯特曲线的一个特殊版本,其中起始点和结束点是相同的,坐标位于2D矩形的中间。一般来说,您的问题看起来像一个离散寻址空间问题

          在这个无向图的例子中,任何节点都可以作为根,这样就可以得到一个合适的树。如果我做对了,哪个节点是根取决于节点的空间排列。但我不清楚“分支不会以锐角从父节点发散”是什么意思。你能澄清一下吗?您能否解释一下,例如,为什么最顶部或最右侧的节点不能成为应用程序的根节点?@paniwani:您的意思是,将兄弟节点链接到其(公共)父节点的分支之间的角度不能是锐角吗?除了坐标和图形结构之外,您还有什么数据结构需要处理吗?除了根节点的阶数,你的树是二进制的吗?二元树将更容易处理,因为相邻边缘之间的3个角度正好是1个,所以父/子关系可以在本地确定。@潘尼瓦尼:请注意,你的问题似乎是不明确的:考虑任何Steiner树;树枝之间根本没有锐角。因此,任何节点都可以被选为根节点,而不会违反您的约束。不是每个节点都可以是树的根,这取决于您如何查看图形吗?该死。。我一直在寻找OP问题的反面,但这个问题解决了。解释得很好,记录得很好。回答得很好。(我知道是老帖子)