1
1
你似乎每个分子(每比特)都有一个有向图,只需做你的技巧,检查每个分子是否有任何非循环。 你可以用一种简单的方法来检查周期,另一种选择是 strongly connected components 你本质上希望每个子图(对于给定分子)都是一个图 connected component 实际上是强连接的。对于强连接组件,有一些很好的算法可以参考前面链接到的维基百科文章。 |
2
1
节点的表示与问题无关。你有一个有向图。您希望验证每个节点和边是否存在包含该边的循环。并且您希望在这方面有合理的效率(而不是从所有边缘对所有可能的循环进行暴力搜索)。
这是一个观察。假设你在图中找到一个循环
所以现在的问题从暴力发现循环到崩溃循环,直到你有一个很容易回答问题的小图表。因此,对于每个节点,对于每个边,都会开始一条路径。您的路径将继续,直到您发现循环。任何循环。(不必返回到原始节点!)折叠该循环,并继续行进,直到您必须回溯(在这种情况下,您的条件不满足),或者您设法循环回原始节点,折叠该循环并移动到另一条边。 如果你实现了这一点,你将有一个多项式算法,但不是你能做的最好的。问题是,在循环崩溃的情况下创建新的图是一项昂贵的操作。但有一个窍门是有用的。与其每次找到循环时都折叠图表,不如试着对它懒惰一点。为该循环创建一个新的“假节点”,并将该循环中的每个节点标记为指向该假节点。每次看到指向节点的边时,都要递归搜索这些映射到找到的最塌陷的节点,并将搜索中看到的所有内容标记为直接映射到那里。
如果你很好地实现了lazy位,你的整个算法应该会结束
|
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
Manny · 如何比较Perl中的字符串? 2 年前 |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |