【问题标题】:Planarity Testing with exceptions for edge types平面性测试,边缘类型除外
【发布时间】:2017-04-03 14:29:39
【问题描述】:

我正在尝试了解是否可以增强平面性检查算法(例如 LR Planarity、PC 树、PQ 树等),从而允许某些边缘根据它们的类型交叉。

我有一个带有 3 种不同类型边的图:A、B、C

类型 A 的边不能跨越任何其他边。

类型 B 的边可以穿过类型 C 的边,反之亦然。

我已经看过一个简单的 LR 平面度测试,但无法成功实现此功能。

是否可以采用现有的算法并根据这些规则对其进行调整,或者是否已经有一种算法支持这一点?

【问题讨论】:

    标签: algorithm graph graph-algorithm planar-graph


    【解决方案1】:

    取出仅包含 A 类边的子图,并使用标准的平面性测试算法来查看它是否是平面的。

    注意:一张图可能是generate multiple planar embeddings [第 60 页],因此您可能需要考虑这一点。

    一旦你有一个 A 型边的平面嵌入,你就可以生成一个面列表。

    从 A 类边生成的平面子图中的两个顶点连接的 B 类边路径只能以平面方式绘制(不与任何 A 类边相交),如果路径的端点都在嵌入的单个面的边界上。根据 Jordan 曲线定理,将其添加到嵌入中将平分执行嵌入的面并生成两个子面。

    注意:同样,一条路径可能能够平分多个面,因此您可能有多个潜在的嵌入。

    继续执行 B 型边/路径的嵌入,这些边/路径在两端都连接到 A 型子图,并且在每一步平分一个面,直到您到达没有可行面平分的点(和图是非平面的)或 A 型和 B 型边是平面的。

    由于 C 型边可以穿过 B 型(反之亦然),您可以将 C 型边(使用相同的面二等分方法)嵌入到 A 型子图中,而无需考虑 B 型边(因为它们可以被划过)。

    虽然对于 A 类型和 B 或 C 类型,这可以在 O(N) 中完成(因为这实际上只是一个普通的平面嵌入),但您可能需要测试多个嵌入来找到适用于的面的方向A、B 和 C 加在一起,得到的算法几乎肯定不会是 O(N)。

    或者,如果您在生成不同嵌入时知道面部排列的约束,那么添加某种基于约束的求解器来协调嵌入中路径的方向可能会有所帮助。

    【讨论】:

    • 我认为这可能确实是最好的解决方案。就个人而言,我考虑将自定义“冲突”规则添加到简单的 LR 平面性算法中 - 但是,这仅在 LR 平面性恰好生成正确的嵌入时才偶尔起作用...
    • @Henri 我链接的平面性测试算法可用于在 O(N) 时间和内存中生成双连通图的所有可能嵌入,第一次嵌入和所有嵌入的 O(N.P) 时间(其中 N 是顶点数,P 是可能的嵌入数)并讨论为连通图生成所有可能的嵌入(但可能没有 O(N.P) 算法)。
    【解决方案2】:

    在不应用平面性测试的情况下获取具有 B 类和 C 类边的子图,然后尝试通过应用平面性测试算法将 A 类边添加到子图中。

    【讨论】:

    • 由 B 和 C 边形成的子图可能是断开的,很可能有多个可能的嵌入。您如何确定将 A 边添加到哪个嵌入?您如何修改现有的平面性测试算法以从部分嵌入的图开始?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2021-05-20
    • 2011-09-26
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多