您将获得一个带有n个顶点的树。每个节点都有一个与之关联的整数权重。 给定树上有大量查询(~n ^ 2)。 对于查询(A,B),其中A,B是树的两个顶点,您需要计算从A到B的唯一路径上节点的权重总和,包括A和B.
我可以为单个查询执行dfs / bfs,但是对于~n ^ 2个可能的查询,这将需要O(n ^ 3)。 任何人都可以建议一些比每次查询少于O(n)的更好的东西吗?
感谢..
答案 0 :(得分:3)
如果树没有root,请将任意节点作为树的根。
我们用W [x]表示节点x的权重,用C [x]表示从根到节点x的所有节点的权重之和。
现在让我们假设有一个类似u, v
:
我们要找到节点u和v的最低公共祖先。让我们假设u和v的LCA是P.所以查询(u,v)的结果将是C[u]-C[P]+C[v]-C[P]+W[P]
答案 1 :(得分:1)
您的问题与Timus Online Judge 1471.Tree非常相似吗? 唯一的区别是节点在您的问题中被加权,而边缘在Ural 1471中加权。树。
这是典型的LCA问题。
将任何节点作为树的根(如果需要),然后计算每个其他节点到根的距离dist [i],使用BFS / DFS需要O(N)时间。 然后对于每个查询(A,B),找到(A,B)的LCA L,然后(A,B)之间的距离是 dist [A] + dist [B] - 2 * dist [L]。
但是,在您的问题中,可能需要将节点权重转换为边缘权重。
如果您不熟悉LCA算法,here是一个非常好的网站,可以帮助您。