![]() |
1
1
你似乎每个分子(每比特)都有一个有向图,只需做你的技巧,检查每个分子是否有任何非循环。 你可以用一种简单的方法来检查周期,另一种选择是 strongly connected components 你本质上希望每个子图(对于给定分子)都是一个图 connected component 实际上是强连接的。对于强连接组件,有一些很好的算法可以参考前面链接到的维基百科文章。 |
![]() |
2
1
节点的表示与问题无关。你有一个有向图。您希望验证每个节点和边是否存在包含该边的循环。并且您希望在这方面有合理的效率(而不是从所有边缘对所有可能的循环进行暴力搜索)。
这是一个观察。假设你在图中找到一个循环
所以现在的问题从暴力发现循环到崩溃循环,直到你有一个很容易回答问题的小图表。因此,对于每个节点,对于每个边,都会开始一条路径。您的路径将继续,直到您发现循环。任何循环。(不必返回到原始节点!)折叠该循环,并继续行进,直到您必须回溯(在这种情况下,您的条件不满足),或者您设法循环回原始节点,折叠该循环并移动到另一条边。 如果你实现了这一点,你将有一个多项式算法,但不是你能做的最好的。问题是,在循环崩溃的情况下创建新的图是一项昂贵的操作。但有一个窍门是有用的。与其每次找到循环时都折叠图表,不如试着对它懒惰一点。为该循环创建一个新的“假节点”,并将该循环中的每个节点标记为指向该假节点。每次看到指向节点的边时,都要递归搜索这些映射到找到的最塌陷的节点,并将搜索中看到的所有内容标记为直接映射到那里。
如果你很好地实现了lazy位,你的整个算法应该会结束
|
![]() |
Bala Ji · 以下BFS的实施效率如何? 5 月前 |
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 6 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 6 月前 |
![]() |
VIAGC · 使用相邻列表创建图形 1 年前 |
![]() |
Alexander · 提取节点属性最大值的键 2 年前 |
![]() |
quantummidget · 正在查找BFS父关系数组 7 年前 |