我的问题很直接。
给出加权树。我们必须找到两个给定节点之间的距离。
因为每次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/
答案 0 :(得分:1)
您的方法听起来很合理,但查看链接代码我建议您尝试一个小例子(例如树中有3个节点)并仔细检查父数组的内容。
据我所知,改变父数组内容的唯一行是:
memset(parent,-1,sizeof parent);
和
parent[i][j]=parent[i-1][parent[i-1][j]]
所以我相信父母的内容总是等于-1。
也许您需要一个基本案例设置parent [0] [j]等于j的父级?
此外,从代码中可以清楚地看出,您是使用深度来表示边数的计数,还是所有边的权重之和。要使距离计算起作用,您需要一个权重之和,但是为了使LCA算法起作用,您可能会发现需要使用边数。