具有最小生成树(MST)的图(正权重边) 如果某些边e被修改为新值,那么更新MST的最佳方法是什么,而不完全重新制作它。我认为这可以在线性时间内完成。此外,似乎需要根据以下两点不同情况应用不同的算法:1)e已经是MST的一部分,2)新边e比原始边大或小。
具有最小生成树(MST)的图(正权重边) 如果某些边e被修改为新值,那么更新MST的最佳方法是什么,而不完全重新制作它。我认为这可以在线性时间内完成。此外,似乎需要根据以下两点不同情况应用不同的算法:1)e已经是MST的一部分,2)新边e比原始边大或小。
有4种情况:
边在 MST 中,且你减小了边的权值:
当前的 MST 仍然是 MST。
边不在 MST 中,且你减小了边的权值:
将该边添加到 MST 中。现在您已经得到确切的 1 个环。
根据 MST 的环属性,您需要找到并删除该环上具有最高值的边。您可以使用 dfs 或 bfs 完成此操作。复杂度为 O(n)。
边在 MST 中,且您增加了它的权值:
从 MST 中删除此边。现在您有两个相连的组件需要连接起来。您可以使用 O(n)(bfs 或 dfs)计算两个组件。您需要找到连接这些组件的最小权值边。按其权值升序迭代各个边。复杂度为 O(n)。
边不在 MST 中,且您增加了它的权值:
当前的 MST 仍然是 MST。
我的O(n)解决方案基于一个假设,即在修改边之前,您应该找到MST(图表中没有给出)。为了这样做,您可以使用Kruskal算法,它的时间复杂度为O(n log n),并且作为副作用会生成已排序的边缘列表。它的代价是由排序主导的,因此当您修改边的权重时,您可以在O(log n)中从已排序的列表中删除它,并以新值再次插入,也在O(log n)中,最后再次调用Kruskal算法,现在它运行的时间是线性的,因为边缘是已排序的。
正如您所要求的那样,这是一个线性解决方案,但看起来可以更快地完成。