【问题标题】:Which algorithms are there to find the Smallest Set of Smallest Rings?有哪些算法可以找到最小环的最小集合?
【发布时间】:2015-08-18 11:40:54
【问题描述】:

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

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

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

【问题讨论】:

  • 你谷歌了吗?看看这个survey - 在第一个结果中甚至有一篇关于该主题的开放博士论文......
  • 您可能还想重新评估您的用例。由于 SSSR 不是唯一的,因此它通常不是您真正想要的。请参阅此处的讨论:ics.uci.edu/~dock/manuals/oechem/cplusprog/node127.html

标签: algorithm graph chemistry


【解决方案1】:

Horton 的算法非常简单。我会为你的用例描述它。

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

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

第 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

所以这组循环是依赖的(不要保留最后一行)。

【讨论】:

  • 感谢您的回复!你能进一步解释 0-1 矩阵吗?行应该是接受循环的节点吗?以及如何按边缘索引列?哪个边缘,它的哪一部分?
  • @MarinGeorgiev 给你一个矩阵的小例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多