|   |      1 
                                  1
                             你似乎每个分子(每比特)都有一个有向图,只需做你的技巧,检查每个分子是否有任何非循环。 你可以用一种简单的方法来检查周期,另一种选择是 strongly connected components 你本质上希望每个子图(对于给定分子)都是一个图 connected component 实际上是强连接的。对于强连接组件,有一些很好的算法可以参考前面链接到的维基百科文章。 | 
|   |      2 
                                  1
                             节点的表示与问题无关。你有一个有向图。您希望验证每个节点和边是否存在包含该边的循环。并且您希望在这方面有合理的效率(而不是从所有边缘对所有可能的循环进行暴力搜索)。 
   这是一个观察。假设你在图中找到一个循环
    所以现在的问题从暴力发现循环到崩溃循环,直到你有一个很容易回答问题的小图表。因此,对于每个节点,对于每个边,都会开始一条路径。您的路径将继续,直到您发现循环。任何循环。(不必返回到原始节点!)折叠该循环,并继续行进,直到您必须回溯(在这种情况下,您的条件不满足),或者您设法循环回原始节点,折叠该循环并移动到另一条边。 如果你实现了这一点,你将有一个多项式算法,但不是你能做的最好的。问题是,在循环崩溃的情况下创建新的图是一项昂贵的操作。但有一个窍门是有用的。与其每次找到循环时都折叠图表,不如试着对它懒惰一点。为该循环创建一个新的“假节点”,并将该循环中的每个节点标记为指向该假节点。每次看到指向节点的边时,都要递归搜索这些映射到找到的最塌陷的节点,并将搜索中看到的所有内容标记为直接映射到那里。 
   如果你很好地实现了lazy位,你的整个算法应该会结束
    | 
|   | feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 9 月前 | 
|   | Alisa Petrova · 在有向图中更改一对顶点以创建循环 10 月前 | 
|   | Pengcheng · 这个简单的递归函数的输出是什么?你能详细解释一下吗? 10 月前 | 
|   | b39b332d · 使用C++标准库实现高效间隔存储 1 年前 | 
|   | ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 | 
|   | EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |