我想在无向多图中列出所有周期。
Tarjan's strongly connected components algorithm是为有向图编写的。它可以用于多图吗?如果没有,是否存在无向多图的循环列表算法?
答案 0 :(得分:1)
根据您想要计算周期的方式,有几种方法可以将问题减少到Tarjan。
首先,对图表应用两个转换:
您将留下有向图。应用Tarjan的算法。
现在,根据您认为的周期,您可能会也可能不会这样做。如果一个循环设置了节点(恰好具有所需的边缘),那么你可以直接从变换的图形中读取循环。
如果一个循环是一组边(共享所需的节点),那么你需要“解开”上面步骤2中引入的边。对于每个折叠边,沿着它替换的实际边集进行枚举。对每个折叠循环中的每个边进行此操作将产生组合爆炸中的所有实际循环。请注意,这将产生假的两个周期,您需要修剪它。
为了说明,假设原始图表有三个节点A
,B
和C
,其中两个边距位于A
和B
之间,一个位于B
和C
之间{1}}和A
以及C
和A
之间的一个。折叠图表将是一个三角形,有一个周期。
在三个节点之间找到一个循环,遍历每个边的组合以恢复整个循环组。这里有两个周期:都包括C
到B
和C
到A
边。他们选择的B
到B
边缘不同。
如果原始图表在C
和4 == 2 * 2 * 1
之间也有两条边,则会有四个展开的图。扩展周期的总数是边数的乘积:{{1}}。