我有一个无向图。该图中的一条边是特殊的。我想找到所有其他边,这些边是包含第一条边的偶数环的一部分。
我不需要枚举所有的环,因为那本质上是NP问题。我只需要知道对于每一条边,它是否满足上述条件。
暴力搜索当然可以解决,但速度太慢,我正在努力想出更好的方法。任何帮助都将不胜感激。
我有一个无向图。该图中的一条边是特殊的。我想找到所有其他边,这些边是包含第一条边的偶数环的一部分。
我不需要枚举所有的环,因为那本质上是NP问题。我只需要知道对于每一条边,它是否满足上述条件。
暴力搜索当然可以解决,但速度太慢,我正在努力想出更好的方法。任何帮助都将不胜感激。
我认为我们有了一个答案(我必须感谢我的同事提出的想法)。他的想法本质上是通过做一种洪水填充算法来穿过偶数环的空间。这个方法有效是因为如果你有一个由两个较小的环合并形成的大偶数环,那么较小的环必须都是偶数或者都是奇数。同样地,合并一个奇数环和一个偶数环总是形成一个更大的奇数环。
这只是一个实际的选择,因为我可以想象出由交替的偶数和奇数环组成的病态情况。在这种情况下,我们永远找不到相邻的偶数环,所以算法会很慢。但我相信这样的情况在真正的化学中不会出现。至少在当前已知的化学中,30年前我们从未听说过富勒烯。
如果您的图具有较小的节点度数,您可能需要考虑使用不同的图表示方法:
假设有三个原子 u,v,w
和两个化学键 e=(u,v)
和 k=(v,w)
。一种典型的表示这些数据的方式是将 u,v,w
存储为节点,并将 e,k
存储为图中的边。
然而,我们也可以将 e
和 k
表示为图中的节点,并建立像 f=(e,k)
这样的边,其中 f
表示从 u
到 w
的 2 步链接,f=(e,k)
或者 f=(u,v,w)
。在这样的图上运行任何查找循环的算法都会返回原始图上的所有偶数循环。
当然,这只在原始图具有较小的节点度数时才有效率。当用户执行编辑操作时,您可以轻松地相应地编辑替代表示。