平面图中的小循环查找

时间:2009-05-08 03:13:30

标签: algorithm language-agnostic graph-theory planar-graph

我有一个几何无向planar graph,这是一个图表,其中每个节点都有一个位置,没有2个边交叉,我想找到没有边穿过它们的所有周期。

这个问题是否有任何好的解决方案?


我打算做的是一种A*类似解决方案:

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

有没有人看到这个问题?它会工作吗?

3 个答案:

答案 0 :(得分:11)

我的第一直觉是使用类似于wall following迷宫求解器的方法。本质上,跟随边,并始终从顶点取出最右边。您使用此方法遇到的任何循环都将是面的边界。您必须跟踪您在哪个方向上经过的边缘。一旦你在两个方向上遍历了一条边,你就已经确定了它所分离的面。一旦在两个方向上遍历了所有边,您就可以通过边界识别所有面。

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

这样做的一个简单方法就是简单地走出去并枚举每张脸。原理很简单:

  • 我们维护每个边缘的'α访问'和'β访问'标志,以及每个这样的标志的一对双边链接的未访问边缘列表。 'α'和'β'除法应该对应于与所讨论的边缘相对应的线上的平面的分区;哪一侧是α,哪一侧是β是任意的。
  • 对于每个顶点V:
    • 对于每对相邻的边E =(V_1,V),E'=(V_2,V)(即按角度排序,取相邻对,以及第一个+最后一个):
    • 确定E(S =α或β)V_2的哪一侧S位于其上。
    • 使用E的S侧,从V开始走瓷砖,如下所述:

通过以下方式执行操作:

  • 设V = V_init
  • 循环:
    • V_next = E的顶点不是V
    • E'=来自V_next的E的相邻边缘,位于E
    • 的当前一侧
    • S'=包含V
    • 的E'侧
    • 如果V_next = V,我们找到了一个循环;记录我们在途中经过的所有边缘,并将这些边对标记为已访问。
    • 如果E'= E(只有一条边),那么我们已经走到了尽头;中止这次散步
    • 否则,让V = V_next,E = E',S = S'并继续。

我希望这是有道理的;它可能需要一些图解释......