代码之家  ›  专栏  ›  技术社区  ›  BCS

平面图中的小循环查找

  •  9
  • BCS  · 技术社区  · 15 年前

    我有一个没有方向的几何图形 planar graph ,这是一个图,其中每个节点都有一个位置,没有两条边相交,我想找到所有没有边相交的循环。

    这个问题有什么好的解决办法吗?


    我计划做的是 A* 类似的解决方案:

    • 将最小堆中的每个边插入为路径
    • 用每个选项扩展最短路径
    • 剔除循环到其他路径的路径(可能不需要)
    • 剔除第三条使用给定边的路径

    有人看到这个问题吗?它还能用吗?

    3 回复  |  直到 13 年前
        1
  •  11
  •   user57368    15 年前

    我的第一直觉是使用类似于 wall following 迷宫求解器。基本上,跟随边,总是从顶点中取出最右边的边。使用此方法遇到的任何循环都将是面的边界。你必须跟踪你在哪个方向穿过的边。一旦你在两个方向穿过一条边,你就可以识别出它分开的面。一旦所有边在两个方向上都被遍历,就可以通过它们的边界来识别所有面。

        2
  •  5
  •   John Fouhy    15 年前

    如你所说的“交叉边缘”,通常被称为 chord . 因此,您的问题是找到所有无弦循环。

    This paper 看起来可能会有帮助。

        3
  •  2
  •   bdonlan    15 年前

    要做到这一点,一个简单的方法就是简单地去列举每一张脸。原理很简单:

    • 我们为每个边缘维护“访问”和“访问”标志,并为每个此类标志维护一对未访问边缘的双重链接列表。“_”和“_”划分应对应于与所述边缘对应的直线上的平面划分;哪一侧为_?,哪一侧为_?是任意的。
    • 对于每个顶点V:
      • 对于每个相邻的边对e=(v_1,v),e'=(v_2,v)(即,按角度排序,取相邻的边对,以及第一个+最后一个边对):
      • 确定E(S=_?或_2)V_2的S侧。
      • 从V开始,使用E的S侧行走瓷砖,如下所述:

    在瓷砖上行走的方式是:

    • 设v= vth-nIT
    • 循环:
      • v_next=e的顶点,不是v
      • e’=e的当前边上的v_next到e的相邻边。
      • s'=e'中包含v的边
      • 如果v_next=v,我们找到了一个循环;记录我们在路上经过的所有边,并将这些边对标记为已访问。
      • 如果e’=e(只有一条边),那么我们就走到了尽头;中止这次步行。
      • 否则,让v=v_next,e=e',s=s'继续。

    我希望这是有道理的,也许需要一些图表来解释…