加权无向图中的总成对成本
Total pairwise costs in a weighted undirected graph
假设我们有一个加权无向图,其中对于任何两个顶点,都有一条连接它们的唯一路径。有 n
个顶点和 n - 1
个边,每条路的成本是 c_i
.
现在,如果连接两个给定顶点的每条路径都有一定的成本,这取决于它经过的道路,我们如何有效地计算所有城市对之间的总成本?
例如每条路径的代价可以是它经过的第一条路和最后一条路的总和,或者是它经过的每条路的代价的某次幂之和,或者是最大的成本减去它经过的道路成本的最小值:任何取决于道路成本的公式。
使用什么算法可以有效地解决问题?
对于图中的每条边{u,v}
,通过"removing"它,你得到两个断开的组件,让它们成为U
和V
。
这意味着边{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)
,最后求出总成本。
假设我们有一个加权无向图,其中对于任何两个顶点,都有一条连接它们的唯一路径。有 n
个顶点和 n - 1
个边,每条路的成本是 c_i
.
现在,如果连接两个给定顶点的每条路径都有一定的成本,这取决于它经过的道路,我们如何有效地计算所有城市对之间的总成本?
例如每条路径的代价可以是它经过的第一条路和最后一条路的总和,或者是它经过的每条路的代价的某次幂之和,或者是最大的成本减去它经过的道路成本的最小值:任何取决于道路成本的公式。
使用什么算法可以有效地解决问题?
对于图中的每条边{u,v}
,通过"removing"它,你得到两个断开的组件,让它们成为U
和V
。
这意味着边{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)
,最后求出总成本。