树中两个节点之间的距离加权

时间:2015-11-06 20:03:11

标签: algorithm graph lowest-common-ancestor

我的问题很直接。

  

给出加权树。我们必须找到两个给定节点之间的距离。

因为每次bfs超时时查询的数量非常多(大约75000),所以我尝试了不同的方法来做到这一点。

我的算法是这样的:

  • 我从顶点0运行dfs并计算从根(0)到所有顶点的距离

        depth[v]=depth[u]+w,where u is parent of v and w is weight b/w (u,v)
    
  • 一旦我使用dfs和每个节点的第二个父节点计算了所有节点的深度(假设我知道该怎么做)。我计算了 LCA for(u,v)询问每个查询。

  • 然后我像这样计算距离

        distance between (u,v)=depth[u]+depth[v]-2*depth[lca(u,v)] 
    

但我没有得到正确的判断。我的算法是正确的还是我错过了一些关键的东西。需要指导。)

P.s Incase任何人都希望看到我的实施 - 链接http://paste.ubuntu.com/13129038/

1 个答案:

答案 0 :(得分:1)

您的方法听起来很合理,但查看链接代码我建议您尝试一个小例子(例如树中有3个节点)并仔细检查父数组的内容。

据我所知,改变父数组内容的唯一行是:

memset(parent,-1,sizeof parent);

parent[i][j]=parent[i-1][parent[i-1][j]]

所以我相信父母的内容总是等于-1。

也许您需要一个基本案例设置parent [0] [j]等于j的父级?

此外,从代码中可以清楚地看出,您是使用深度来表示边数的计数,还是所有边的权重之和。要使距离计算起作用,您需要一个权重之和,但是为了使LCA算法起作用,您可能会发现需要使用边数。