Algorithm 偶数圈检测的图算法

Algorithm 偶数圈检测的图算法,algorithm,graph,graph-theory,Algorithm,Graph,Graph Theory,我有一个无向图。图中的一条边是特殊的。我想找到包含第一条边的偶数循环中的所有其他边 我不需要列举所有的循环,我认为这是本质上的NP。我只需要知道,对于每条边,它是否满足上述条件 蛮力搜索当然有效,但速度太慢,我正在努力找到更好的方法。感谢您的帮助。我想我们已经找到了答案(我必须相信我的同事有这个想法)。从本质上讲,他的想法是通过偶数周期的空间进行洪水填充算法。这是因为如果有一个大的偶数循环,它是由两个较小的循环合并而成的,那么较小的循环必须是偶数或奇数。类似地,奇偶循环的合并总是形成一个更大的奇

我有一个无向图。图中的一条边是特殊的。我想找到包含第一条边的偶数循环中的所有其他边

我不需要列举所有的循环,我认为这是本质上的NP。我只需要知道,对于每条边,它是否满足上述条件

蛮力搜索当然有效,但速度太慢,我正在努力找到更好的方法。感谢您的帮助。

我想我们已经找到了答案(我必须相信我的同事有这个想法)。从本质上讲,他的想法是通过偶数周期的空间进行洪水填充算法。这是因为如果有一个大的偶数循环,它是由两个较小的循环合并而成的,那么较小的循环必须是偶数或奇数。类似地,奇偶循环的合并总是形成一个更大的奇数循环


这是一个实用的选择,因为我可以想象由奇偶周期交替组成的病理病例。在这种情况下,我们永远不会找到两个相邻的偶数循环,因此算法会很慢。但我相信这种情况不会出现在真正的化学中。至少在化学上,正如我们现在所知,30年前,我们从来没有听说过富勒烯。

< P>如果你的图有一个小的节点度,你可以考虑使用不同的图形表示:

让三个原子
u,v,w
和两个化学键
e=(u,v)
k=(v,w)
。表示此类数据的典型方法是将
u、v、w
存储为节点,将
e、k
存储为边

然而,可以将
e
k
表示为图中的节点,具有类似
f=(e,k)
的边,其中
f
表示从
u
w
f=(e,k)
f=(u,v,w)
。运行任何算法在这样一个图上查找循环都将返回原始图上的所有偶数循环


当然,只有当原始图具有较小的节点度时,这才是有效的。当用户执行编辑时,您可以轻松地相应地编辑替代表示。

此处没有足够的信息来提供您所寻求的质量的答案。你提前多久知道哪一条边是特别的?你可以对数据进行预处理吗?你事先接触了多少数据(例如加载数据),你能修改预处理数据的方式吗?此外,如果你不能滥用预处理,你可能需要查看所有的周期,尽管我想不出一种或另一种方式来证明这一断言。@ninjagecko该图代表一种化学结构,也就是说,顶点是原子,边是这些原子之间的化学键。用户正在不断编辑化学结构,该算法有望在用户执行编辑时实时运行。我们为图使用了一个简单的邻接列表结构,尽管我们也维护了一些其他结构(例如,我们始终知道边是否是循环的一部分)。如果我没弄错的话,预处理不是一个选项,因为图形(和特殊边)总是在变化。“虽然我们也维护一些其他结构(例如,我们随时知道边是否是循环的一部分)”——也许可以修改此结构以跟踪它是否是偶数循环的一部分?它是什么样的结构?(预处理应该是可行的,因为用户从文件中加载化学品,或者它是以某种方式生成的,这是一个O(N)操作,但可能不是必需的。)循环是否仅限于简单的循环?两个三角形的尖端之间有一条边(类似沙漏形状)相连,中间的边用了两次,这两个三角形会算作一个长度为8的循环吗?