我有一个未加权的无向连通图。通常,它是一种具有大量循环并排的化合物。这个问题在这个领域很常见,就像标题所说的那样。好的算法是Horton的算法。但是,我似乎无法逐步找到有关算法的任何确切信息。
显然我的问题是Algorithm for finding minimal cycles in a graph,但不幸的是,该网站的链接已被禁用。 我只发现了Figueras算法的python代码,但Figuearas在每种情况下都不起作用。有时它找不到所有的戒指。 问题与此类似,Find all chordless cycles in an undirected graph,我尝试了但不适用于像我这样的更复杂的图形。 我找到了4-5个所需信息来源,但算法并没有完全解释。
我似乎没有找到任何SSSR算法,尽管这似乎是一个常见的问题,主要是在化学领域。
答案 0 :(得分:7)
霍顿的算法非常简单。我将根据您的用例对其进行描述。
对于每个顶点v,计算以v为根的广度优先搜索树。对于每个边wx,使得v,w,x是成对不同的,并且使得w和x的最小公共祖先是v,添加一个循环,包括从v到w的路径,边缘wx,以及从x到v的路径。
按大小非递减对这些周期进行排序,并按顺序考虑它们。如果当前周期可以表示为之前考虑的周期的“异或”,则它不是基础的一部分。
步骤2中的测试是该算法中最复杂的部分。基本上,您需要做的是将接受的周期和候选周期写为0-1关联矩阵,其行按周期索引并且其列由边缘索引,然后在此矩阵上运行高斯消除以查看是否进行全零行(如果是,则丢弃候选周期)。
通过一些努力,每次都可以节省重新消除接受周期的成本,但这是一种优化。
例如,如果我们有图表
a---b
| /|
| / |
|/ |
c---d
然后我们有一个类似
的矩阵 ab ac bc bd cd
abca 1 1 1 0 0
bcdb 0 0 1 1 1
abdca 1 1 0 1 1
我有点作弊,因为abdca
实际上不是步骤1中生成的周期之一。
消除过程如下:
ab ac bc bd cd
1 1 1 0 0
0 0 1 1 1
1 1 0 1 1
row[2] ^= row[0];
ab ac bc bd cd
1 1 1 0 0
0 0 1 1 1
0 0 1 1 1
row[2] ^= row[1];
ab ac bc bd cd
1 1 1 0 0
0 0 1 1 1
0 0 0 0 0
这样一组周期依赖(不要保留最后一行)。