我在大学时遇到过以下问题:
让 G =(V,E)成为(无向)图形,其边缘成本 c e > = 0 em> e ∈ E 。假设您在 G 中获得了最低成本生成树 T 。现在假设将一条新边添加到 G ,连接两个节点 v , t v ∈ V ,费用为 c 。
这是我找到的解决方案:
Let e1=(a,b) the new edge added
Find in T the shortest path from a to b (BFS)
if e1 is the most expensive edge in the cycle then T remains the MST
else T is not the MST
它似乎工作但我可以轻松地在O(| V |)时间运行,而问题要求O(| E |)时间。我错过了什么吗?
顺便说一下,我们有权向任何人寻求帮助,所以我不会作弊:D
答案 0 :(得分:8)
你有正确的想法,但如果以正确的方式存储树,你可以做比BFS更好的最短路径搜索。
假设 T 中的一个节点 r 是根(如果已在矩阵中标记了树边,则可以从那里选择任何节点和BFS来生成此结构或者邻接列表图结构),并且每个其他节点具有父指针和深度计数。要在 T 中找到 a 和 b 之间的最短路径:
该算法的有效性证明留给读者练习。这是像BFS一样的O(| V |),但通常也会更快。实际上,只有少数MST配置实际需要O(| V |)时间。当然,生成父链接树需要O(| V |)时间开始,所以这只在某些情况下有用,例如,如果您使用MST构建算法,在确定的过程中自然地创建此结构MST。
正如另一位评论者所说,请注意,如果图表中有MST,则表示已连接,因此| V | < = | E |因此O(| V |)< O(| E |)。
此外,要在O(| V |)时间内修复树,如果需要,只需找到循环中最长的边并将其移除,将其替换为新边。使用父链接MST有效地执行此操作也是读者的一项练习。
答案 1 :(得分:0)
我认为BFS就足够了。它的复杂性是O(| V | + | E |),但在树| E |中小于| V |所以O(2 | V |)就是O(| V |)
答案 2 :(得分:-1)
我相信您的步骤Find in T the shortest path from a to b
是订单E操作。