给定一棵树,它有N个顶点,编号从0到N – 1,有 M 条边, Q查询的形式为{U, V},这样树中U和V之间就有一条直接边。每个查询的任务是从包含给定节点对之间的边的给定树中的任何可能的无序顶点对之间找到所有可能的最短路径。
例子:
Input: N = 6, M[] ={{0, 1}, {0, 2}, {1, 3}, {3, 4}, {3, 5}}, queries[] = {{1, 3}, {0, 2}}
0
/ \
1 2
/
3
/ \
4 5
Output:
9
5
Explanation:
Query 1: The edge (1, 3) lies in the paths {1, 3), (1, 3, 4), (1, 3, 5), (0, 3), (0, 4), (0, 5), (2, 3), (2, 4) and (2, 5).
Query 2: The edge (0, 2) lies in the paths (2, 0), (2, 1), (2, 3), (2, 4) and (2, 5).
Input: N = 6, M[] ={{0, 1}, {0, 2}, {2, 3}, {1, 4}, {1, 5}}, queries[] = {{1, 5}, {0, 2}}
0
/ \
1 2
/ \ /
4 5 3
Output:
5
8
方法:该问题可以基于以下观察来解决:对于任何查询{U, V},如果其中一个节点位于树中,则树中任何一对节点之间的最短路径将包含给定边(U, V) U 的子树,另一个节点位于剩余的树中。因此,所需的对数为:
Count of shortest paths containing (U, V) as an edge = subtreeSize(U) * (N – subtreeSize(V)).
因此,请按照以下步骤解决问题:
- 从根节点开始对树执行深度优先搜索遍历。
- 对于每个节点,将节点数存储在其子树中(包括节点)。
- 迭代每个查询 (U, V) 并计算:
min( subtreeSize(U), subtreeSize(V)) * ( N – min( subtreeSize(U), subtreeSize(V)) )
下面是上述方法的实现:
C++
Java
Python3
C#
Javascript
时间复杂度: O(N + M + Q)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。