在Multigraph中循环检测

时间:2013-03-14 04:04:07

标签: algorithm graph

我想在无向多图中列出所有周期。

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

1 个答案:

答案 0 :(得分:1)

根据您想要计算周期的方式,有几种方法可以将问题减少到Tarjan。

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

  1. 通过用一对相对的有向边替换每个无向边来转换为有向图。
  2. 对于每对节点,将指向同一方向的边折叠为单个边。
  3. 您将留下有向图。应用Tarjan的算法。

    现在,根据您认为的周期,您可能会也可能不会这样做。如果一个循环设置了节点(恰好具有所需的边缘),那么你可以直接从变换的图形中读取循环。

    如果一个循环是一组边(共享所需的节点),那么你需要“解开”上面步骤2中引入的边。对于每个折叠边,沿着它替换的实际边集进行枚举。对每个折叠循环中的每个边进行此操作将产生组合爆炸中的所有实际循环。请注意,这将产生假的两个周期,您需要修剪它。

    为了说明,假设原始图表有三个节点ABC,其中两个边距位于AB之间,一个位于BC之间{1}}和A以及CA之间的一个。折叠图表将是一个三角形,有一个周期。

    在三个节点之间找到一个循环,遍历每个边的组合以恢复整个循环组。这里有两个周期:都包括CBCA边。他们选择的BB边缘不同。

    如果原始图表在C4 == 2 * 2 * 1之间也有两条边,则会有四个展开的图。扩展周期的总数是边数的乘积:{{1}}。