考虑到我们有一个加权无向图,其中对于任何两个顶点,都有一条连接它们的唯一路径。有n
个顶点和n - 1
边,每条道路的费用为c_i
。
现在,如果连接两个给定顶点的每条路径都有一定的成本取决于它经过的道路,那么我们如何有效地计算所有城市对之间的总成本呢?
例如,每条路径的成本可以是第一条道路和它经过的最后一条道路的总和,或者它经过的每条道路的成本的某些功率的总和,或者成本的最大值减去它经过的道路的最低成本:任何取决于道路成本的公式。
使用什么算法来有效地解决问题?
答案 0 :(得分:2)
对于任何路径p
,让max(p)
和min(p)
表示经过的道路的最高和最低成本。
然后Total_cost = sum for all path p [max(p) - min(p)]
然后可以通过以下方式找到sum for all path p max(p)
Let G=(V,E) be the input graph, which should be a tree
Create a graph G' with vertices set V and no edges
Insert every edge in E to G' from lowest cost to hightest cost
每次插入边e
时,它都会连接两个S, T
组件,您可以看到从p
到S
的每条路径T
,max(p) = cost(e)
所以你可以通过对它们求和来找到sum for all path p max(p)
。
为了有效地连接两个组件,我认为你可以使用Kruskal算法的想法。
同样,您可以找到sum for all path p min(p)
,最后是总费用。
答案 1 :(得分:0)
对于图表中的每个边{u,v}
,通过"删除"它,你得到两个断开连接的组件,让它们为U
和V
。
这意味着,边{u,v}
是从U
中的每个节点到原始图表中V
中每个节点的路径的一部分,并且|U| * |V|
这样的路径。
这意味着,问题归结为计算这些集合的大小。
一种方法是选择任意顶点r
,然后选择#34;使其成为根"通过使所有边缘定向,向外形成r
。在你做完之后,你得到了一个有根的指导树。
通过在线性时间遍历树一次,您现在可以找到每个子树的大小:
size(u) = sum { size(v} | v is a child of u} + 1
计算完所有子树的大小后,对于每个有向边(u,v)
,原始集|V|
和|U|
的大小为size(v)
和{{1} }。
按照这些步骤导致线性时间算法,使用以下高级伪代码。
n-size(v)