加权无向图中的总成对成本

Total pairwise costs in a weighted undirected graph

假设我们有一个加权无向图,其中对于任何两个顶点,都有一条连接它们的唯一路径。有 n 个顶点和 n - 1 个边,每条路的成本是 c_i.

现在,如果连接两个给定顶点的每条路径都有一定的成本,这取决于它经过的道路,我们如何有效地计算所有城市对之间的总成本?

例如每条路径的代价可以是它经过的第一条路和最后一条路的总和,或者是它经过的每条路的代价的某次幂之和,或者是最大的成本减去它经过的道路成本的最小值:任何取决于道路成本的公式。

使用什么算法可以有效地解决问题?

对于图中的每条边{u,v},通过"removing"它,你得到两个断开的组件,让它们成为UV

这意味着边{u,v}是原图中从U中的每个节点到V中的每个节点的路径的一部分,并且有|U| * |V| 这样的路径。
这意味着,问题归结为计算这些集合的大小。

一种方法是选择任意顶点 r,然后 "make it the root" 通过使所有边都指向,形成 r 向外。这样做之后,您就得到了一个有根的有向树。

通过线性时间遍历一次树,你现在可以找到每个子树的大小:

size(u) = sum { size(v} | v is a child of u}  + 1

计算完所有子树的大小后,对于每条有向边(u,v),原始集|V||U|的大小分别为size(v)n-size(v).

按照这些步骤可以得出线性时间算法,以及以下高级伪代码。

Choose arbitrary r
Calculate size(u) for all nodes
sum = 0
for each edge (u,v) do:
  sum = sum + (cost(u,v) * (size(v) * (n-size(v))))
return sum

对于任何路径 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,你可以看到从S到[=20的每条路径p =], max(p) = cost(e) 所以你可以通过对它们求和来找到sum for all path p max(p)。 为了有效地连接两个组件,我认为你可以使用 Kruskal 算法的想法。

同样可以求出sum for all path p min(p),最后求出总成本。