【问题标题】:Cycle detection in a Multigraph多图中的循环检测
【发布时间】:2013-03-14 04:04:06
【问题描述】:

我想在一个无向多重图中列出所有循环。

Tarjan's strongly connected components algorithm 是为有向图编写的。它适用于多图吗?如果没有,是否有无向多图的循环列表算法?

【问题讨论】:

    标签: algorithm graph


    【解决方案1】:

    有几种方法可以将您的问题归结为 Tarjan,具体取决于您希望如何计算周期。

    首先,对您的图表应用两个转换:

    1. 通过将每个无向边替换为一对相反的有向边来转换为有向图。
    2. 对于每对节点,将指向同一方向的边折叠成一条边。

    您将得到一个有向图。应用 Tarjan 算法。

    现在,根据您对周期的看法,您可能完成也可能不完成。如果一个循环是一组节点(恰好拥有所需的边),那么您可以直接从转换后的图中读取循环。

    如果一个循环是一组边(共享所需的节点),那么您需要“展开”上面第 2 步中引入的边。对于每个折叠的边,沿着它替换的一组真实边进行枚举。对每个折叠循环中的每个边缘都这样做将在组合爆炸中产生所有实际循环。请注意,这会产生虚假的两个周期,您需要对其进行修剪。

    为了说明,假设原始图有三个节点ABC,两条边在AB之间,一条在BC之间,一条在@之间987654328@ 和C。折叠的图形将是一个三角形,有一个循环。

    在三个节点之间找到一个循环后,遍历每个边的组合以恢复完整的循环集。这里有两个循环:都包括ACBC 边。它们在选择的AB 边缘方面有所不同。

    如果原始图在BC 之间也有两条边,那么将有四个扩展图。扩展循环的总数是边数的乘积:4 == 2 * 2 * 1

    【讨论】:

    • 你能画一张折叠和展开的图片吗?我不确定你的意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2016-10-26
    相关资源
    最近更新 更多