有人可以帮我解决这个问题吗?
我们有一组道路,一组H高速公路和一组不同城市。我们还有与每条道路i相关的成本x(i)和与每条高速公路i相关的成本y(i)。我们希望建立连接城市的道路,条件是任何一对城市之间总是有路径,我们最多可以建造一条高速公路,这可能比公路便宜。
设置E和设置H是不同的,它们各自的成本是无关的。
设计一种算法来建造道路(最多只有一条高速公路),以最大限度地降低总成本。
答案 0 :(得分:0)
所以,我们所拥有的是完全连通的边缘图。
解决方案步骤:
O(nm)= m * mst_cost(n)
答案 1 :(得分:0)
使用Prim或Kruskal构建MST:O(E log V)
。
问题是最多1条公路的限制。
对于每条可能的高速公路,从头开始构建MST。
此解决方案的时间复杂度:O(H E log V)
想法:如果你构建了一个MST,你可以使用更好的MST来优化MST,如果你有一个你以前没有考虑过的额外可用边缘。
假设新边连接(u,v)
。如果使用此边,则可以删除MST中顶点u
和v
之间路径中最昂贵的边。您可以在O(V)
时间内找到天真的路径。
使用这个想法,时间复杂度是构建初始MST O(E log V)
的成本以及尝试使用每个H
高速公路优化MST的时间。因此,总算法复杂度为O(E log V + H V)
,这比第一种解决方案更好。
我们可以找到一种更快捷的方法,而不是使用第二种方法进行天真的路径搜索方法。一个相关问题是LCA(最低共同祖先)。解决LCA的一个好方法是使用跳转指针。首先你根目录树,然后每个顶点都有朝向根的跳跃指针(1步,2步,4步等)。预处理可能花费O(V log V)
时间,找到2个顶点的LCA是{{ 1}}最坏的情况(虽然实际上O(log V)
通常更好)。
找到LCA后,隐式地为您提供了顶点O(log (depth of tree))
和u
之间的路径。但是,要找到最昂贵的删除边缘可能会很昂贵,因为遍历路径的成本很高。
在一维问题中,可以使用范围最大查询(RMQ)。这使用段树在v
时间内解决RMQ。
我们有一棵树,而不是一维空间(就像一个数组)。但是,我们可以应用相同的想法,并构建一个分段树状结构。实际上,这相当于将每条跳转指针捆绑在一起。为了找到LCA,树中的每个顶点都会有朝向根的O(log N)
跳转指针。我们可以用跳跃指针捆绑我们跳过的边的最大边缘权重。添加此信息的成本与首先创建跳转指针的成本相同。因此,对LCA算法的细微改进使我们能够在log(tree depth)
时间内找到顶点u
和v
之间路径上的最大边权重。
最后,把它放在一起,第三个解决方案的算法复杂度为O(log (depth))
或等效O(E log V + H log V)
。