我有一个N个节点的图形(2 <= N <= 50000),N是偶数。节点的值始终是介于1和N / 2之间的数字。它被授予在任何一对节点之间只有一条路径,并且边缘的权重总是一条。如何将具有相等值的所有节点的距离相加?
这是一个例子:
广场内的数字是节点的值,下面的小数字是节点的标识。
在此示例中,总和是距离(1,6)+距离(2,5)+距离(3,4)= 5
弗洛伊德 - 马歇尔或简单的BFS对于这种情况来说是昂贵的。 我已经看到在DAG上可以通过拓扑排序获得最短路径。在这种情况下,这是一个很好的方法?
答案 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的改进