【发布时间】:2013-03-14 04:04:06
【问题描述】:
我想在一个无向多重图中列出所有循环。
Tarjan's strongly connected components algorithm 是为有向图编写的。它适用于多图吗?如果没有,是否有无向多图的循环列表算法?
【问题讨论】:
我想在一个无向多重图中列出所有循环。
Tarjan's strongly connected components algorithm 是为有向图编写的。它适用于多图吗?如果没有,是否有无向多图的循环列表算法?
【问题讨论】:
有几种方法可以将您的问题归结为 Tarjan,具体取决于您希望如何计算周期。
首先,对您的图表应用两个转换:
您将得到一个有向图。应用 Tarjan 算法。
现在,根据您对周期的看法,您可能完成也可能不完成。如果一个循环是一组节点(恰好拥有所需的边),那么您可以直接从转换后的图中读取循环。
如果一个循环是一组边(共享所需的节点),那么您需要“展开”上面第 2 步中引入的边。对于每个折叠的边,沿着它替换的一组真实边进行枚举。对每个折叠循环中的每个边缘都这样做将在组合爆炸中产生所有实际循环。请注意,这会产生虚假的两个周期,您需要对其进行修剪。
为了说明,假设原始图有三个节点A、B和C,两条边在A和B之间,一条在B和C之间,一条在@之间987654328@ 和C。折叠的图形将是一个三角形,有一个循环。
在三个节点之间找到一个循环后,遍历每个边的组合以恢复完整的循环集。这里有两个循环:都包括A 到C 和B 到C 边。它们在选择的A 到B 边缘方面有所不同。
如果原始图在B 和C 之间也有两条边,那么将有四个扩展图。扩展循环的总数是边数的乘积:4 == 2 * 2 * 1。
【讨论】: