所有在具有N个节点和N-1个边的连通图中的最短路径对

时间:2015-09-19 11:02:33

标签: algorithm

我有一个N个节点的图形(2 <= N <= 50000),N是偶数。节点的值始终是介于1和N / 2之间的数字。它被授予在任何一对节点之间只有一条路径,并且边缘的权重总是一条。如何将具有相等值的所有节点的距离相加?

这是一个例子:

广场内的数字是节点的值,下面的小数字是节点的标识。

Graph

在此示例中,总和是距离(1,6)+距离(2,5)+距离(3,4)= 5

弗洛伊德 - 马歇尔或简单的BFS对于这种情况来说是昂贵的。 我已经看到在DAG上可以通过拓扑排序获得最短路径。在这种情况下,这是一个很好的方法?

1 个答案:

答案 0 :(得分:2)

我在这里假设您将节点的不相交分区设置为成对,由1到N / 2之间的数字表示。我还假设“在任何节点对之间只有一条路径”,你的意思是任何对,而不仅仅是那些颜色相同的那些。

在这种情况下,首先要意识到你的图是一棵树。因此,任意根据它,并以深度优先的顺序遍历它以计算所有节点的深度。请注意,对于两个节点x和y,如果它们的最低共同祖先是l,那么

distance(x, y) = distance(x, l) + distance(y, l) 
               = depth(x) - depth(l) + depth(y) - depth(l) 
               = depth(x) + depth(y) - 2*depth(l)

您可以使用Tarjan's off-line LCA algorithm计算(几乎)线性时间内所有对的LCA并计算距离。在这种情况下,您甚至不需要存储LCA。

运行时:O(n *α(n))具有天真的不相交集合联合,O(n)具有来自"A Linear-Time Algorithm for a Special Case of Disjoint Set Union", Gabow & Tarjan, 1983的改进