2015-11-06 109 views
2

我的问题非常直截了当。树中两个节点之间的距离加权

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

因为每次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和每个节点的第2个父节点(假设我知道该怎么做)。我计算了LCA为(u,v)询问了每个查询。

  • 然后我计算方法为距离这样

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

但如预期,我没有得到正确的判决。 是我的算法正确的还是我失去了一些重要的 .Guidance需要:)

诗柜面任何人希望看到我实现链路http://paste.ubuntu.com/13129038/

回答

1

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

据我可以看到,唯一的线路改变父阵列的内容是:

memset(parent,-1,sizeof parent); 

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

因此相信父的内容将总是等于-1 。

也许需要一个碱情况下设置父[0] [j]的等于j的父?

而且,它不是你是否使用深度是指边的数量,或所有边的权重之和的计数从代码很清楚。为了计算距离,您需要一个权重总和,但要使LCA算法起作用,您可能会发现需要使用边数。

+0

喜先生,我刚才看到我忽略父阵列的基本情况十分感谢这一点,但它仍然没有得到正确的可能是一些其他犯错误发现问题这个正确的解决办法,但我不明白为什么我错了还是我的算法是错误的,你可以帮助看到这个http://paste.ubuntu.com/13129663/ –

+0

嗨,先生,谢谢你的时间。我终于解决了这个问题。我正在做的一个实际的错误是计算LCA的重量是垃圾。我使用另一个阵列作为节点深度并计算LCA(愚蠢的我:p)。感谢您的时间(实现-http://paste.ubuntu.com/13142974/)+1。 –