我正在使用Java程序以各种方式分析图形,特别是具有加权边的无向图形。我现在尝试给定一个平面图,确定其面,也就是由图的边线界定的“空间”的封闭区域,但是我真的找不到一种算法,或者至少是一种可理解的算法,可以做到这一点而我正在努力实现其中之一。
有人有什么主意吗?
PS:我应该指出,我对图论没有很扎实的基本了解
答案 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)
您有了面孔(每个边缘都被访问过两次-每个方向一次)。