是否有确定平面图面的算法?

时间:2018-06-23 00:21:33

标签: java graph-theory

我正在使用Java程序以各种方式分析图形,特别是具有加权边的无向图形。我现在尝试给定一个平面图,确定其面,也就是由图的边线界定的“空间”的封闭区域,但是我真的找不到一种算法,或者至少是一种可理解的算法,可以做到这一点而我正在努力实现其中之一。

有人有什么主意吗?

PS:我应该指出,我对图论没有很扎实的基本了解

1 个答案:

答案 0 :(得分:1)

平面图的面取决于是否将平面图嵌入到表面上。出现的问题是,平面图可能有多个嵌入。

例如:

   ----1----         ----1----      
  /   / \   \       /   / \   \     
 /   /   \   \     /   /   \   \    
2   3-----4   |   2   4-----3   |   
 \   \   /   /     \   \   /   /    
  \   \ /   /       \   \ /   /     
   ----5----         ----5----      

上面的图可以用两种不同的方式嵌入,每种方式都有不同的面孔。

因此,第一个问题是生成任何单个嵌入。最有效的平面度测试将通过生成嵌入来测试平面度(而不是使用效率较低的方法,例如寻找被禁止的未成年人),因此您应该能够对此进行任何平面度测试。较难的问题是生成所有可能的嵌入-但是,Planarity Testing by Path Addition中对此有一个解决方案(并且在附录中包含Java代码以执行平面性测试,生成嵌入,从双向图的一次嵌入中生成一个循环到其他嵌入,并为嵌入的每个顶点生成一个循环边缘顺序。

一旦嵌入,就可以将图形表示为每个顶点的循环边缘顺序。因此,对于左侧示例:

Vertex Clockwise Edge-Order
------ --------------------
     1              2,5,4,3
     2                  1,5
     3                1,4,5
     4                1,5,3
     5              1,2,3,4

然后要找到这些面,只需从一条边开始,顺时针或逆时针拾取,并从连续的顶点开始一直沿该方向拾取下一个相邻边,直到返回起始边为止。

Clockwise (2,1) -> (1,5) -> (5,2)
Clockwise (1,2) -> (2,5) -> (5,3) -> (3,1)
Clockwise (1,3) -> (3,4) -> (4,1)
Clockwise (1,4) -> (4,5) -> (5,1)
Clockwise (4,3) -> (3,5) -> (5,4)

您有了面孔(每个边缘都被访问过两次-每个方向一次)。