java - 是否有确定平面图面的算法?
问题描述
我正在开发一个 Java 程序,以各种方式分析图,特别是带有加权边的无向图。我现在正在尝试,给定一个平面图,确定它的面,也就是由图的边缘分隔的“空间”的封闭区域,但我真的找不到一种算法,或者至少是一个可以理解的算法,可以做到这一点我正在努力实施我的一个。
有人有什么想法吗?
PS:我应该注意我对图论没有扎实的基本掌握
解决方案
平面图的面取决于将平面图嵌入到表面上。问题出现了,一个平面图可能有多个嵌入。
例如:
----1---- ----1----
/ / \ \ / / \ \
/ / \ \ / / \ \
2 3-----4 | 2 4-----3 |
\ \ / / \ \ / /
\ \ / / \ \ / /
----5---- ----5----
上图可以以两种不同的方式嵌入,每种方式都有不同的面。
所以第一个问题是生成任何单个嵌入;最有效的平面性测试将通过生成嵌入来测试平面性(而不是使用效率较低的方法,例如寻找禁止的未成年人),因此您应该能够为此使用任何平面性测试。更难的问题是生成所有可能的嵌入 - 然而,在通过路径添加的平面测试中有一个解决方案(并且在附录中包含 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)
而且你有面孔(每个边缘都被访问了两次 - 每个方向一次)。
推荐阅读
- css - 如何在引导程序中为 div 解释 mb-xl-5?
- python - 为什么我的函数会跳过 else 语句?
- python - Pandas/Python - 根据传入文件合并不同列上的文件
- tree - 我怎样才能返回一个中序遍历而不是仅仅打印它
- android - 是否可以先成功握手,然后故意不从服务器端发送服务器证书?
- android - “实体和 POJO 必须有一个可用的公共构造函数”和“@androidx.room.Ignore`
- c++ - GitHub 操作中 boost::read_graphviz 的问题
- firebase - Firebase 仪表板中缺少登录状态和活跃用户显着增加
- bash - 循环检查用户定义的数字的倍数是否在用户定义的范围内
- python - Django admin 不会加载某些静态文件