因此,确定边缘是否在最小生成树中似乎可以减少到边缘是否是某个周期的最重边缘的问题。我知道如何使用DFS检测边缘是否处于循环中,但是如何确定它是否是该循环中最重的边缘?是通过找到周期并选择最重的边缘来进行的吗?
答案 0 :(得分:5)
假设所有边都有不同的权重,一个简单而相当优雅的算法就是做一个修改过的DFS。请注意,如果此边缘是某个周期中最重的边缘,那么如果您要查看通过删除比当前边缘更重的所有边缘形成的图形,则必须有一条从边缘端点返回到开始的路径。边缘,因为这条路径与边缘本身相结合,形成一个循环,给定边缘是最重的边缘。相反,如果没有包含给定边缘最重的边缘的循环,那么如果您要从边缘的末端搜索此图形到源,那么您将无法返回到边缘的来源,因为否则你可以把它完成一个循环。这给出了以下简单的算法:在原始图形中从边缘的端点返回源到DFS,但是每当遇到比原边缘重的边缘时,不要处理它(这模拟从中删除它图)。如果你的DFS将你从边缘的末端带回到源,那么你知道必须有一个边缘是最重的边缘的循环,如果没有这样的循环,那么你将无法获得回到边缘的源头。
在边缘不明显的情况下,您将执行与上面相同的搜索,但是您将删除权重大于或等于当前边缘权重的所有边。这样做的原因是,如果在这个变换图中有一条从边缘末端到边缘起点的路径,你知道我们最终没有使用任何与成本相同的边缘。原始边缘,因此找到的任何路径都可以完成到给定边缘最重的循环中。如果没有路径,那么
在任何一种情况下,它都不是周期中最重的边缘。
该算法的运行时间为O(m + n),即执行标准DFS所需的时间。
希望这有帮助!