最小的圆环

时间:2015-08-18 11:40:55

标签: algorithm graph chemistry

我有一个未加权的无向连通图。通常,它是一种具有大量循环并排的化合物。这个问题在这个领域很常见,就像标题所说的那样。好的算法是Horton的算法。但是,我似乎无法逐步找到有关算法的任何确切信息。

显然我的问题是Algorithm for finding minimal cycles in a graph,但不幸的是,该网站的链接已被禁用。  我只发现了Figueras算法的python代码,但Figuearas在每种情况下都不起作用。有时它找不到所有的戒指。  问题与此类似,Find all chordless cycles in an undirected graph,我尝试了但不适用于像我这样的更复杂的图形。  我找到了4-5个所需信息来源,但算法并没有完全解释。

我似乎没有找到任何SSSR算法,尽管这似乎是一个常见的问题,主要是在化学领域。

1 个答案:

答案 0 :(得分:7)

霍顿的算法非常简单。我将根据您的用例对其进行描述。

  1. 对于每个顶点v,计算以v为根的广度优先搜索树。对于每个边wx,使得v,w,x是成对不同的,并且使得w和x的最小公共祖先是v,添加一个循环,包括从v到w的路径,边缘wx,以及从x到v的路径。

  2. 按大小非递减对这些周期进行排序,并按顺序考虑它们。如果当前周期可以表示为之前考虑的周期的“异或”,则它不是基础的一部分。

  3. 步骤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
    

    这样一组周期依赖(不要保留最后一行)。