【问题标题】:Distance between two nodes in a tree weighted加权树中两个节点之间的距离
【发布时间】:2015-11-06 20:03:10
【问题描述】:

我的问题很直接。

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

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

我的算法是这样的:

  • 我从顶点 0 运行 dfs 并计算从 root(0) 到所有顶点的距离,类似这样

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

  • 然后我这样计算距离

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

但我没有得到预期的正确判决。我的算法是正确的还是我遗漏了一些重要的东西。需要指导:)

P.s 如果有人想看我的实现-Link http://paste.ubuntu.com/13129038/

【问题讨论】:

    标签: algorithm graph lowest-common-ancestor


    【解决方案1】:

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

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

    memset(parent,-1,sizeof parent);
    

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

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

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

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

    【讨论】:

    • 嗨,先生,我刚刚看到我忽略了父数组的基本情况,所以谢谢你,但它仍然没有得到正确可能是其他错误。我找到了这个问题的正确解决方案,但我不明白为什么我错了,或者我的算法错了,看到这个paste.ubuntu.com/13129663,你能帮忙吗?
    • 嗨,先生,谢谢你的时间。我终于解决了这个问题。实际上我犯的错误是用重量计算 LCA,这是垃圾。我使用另一个数组作为节点深度并计算 LCA那(愚弄我:p)。感谢您的时间(实施-paste.ubuntu.com/13142974)+1 时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2019-03-29
    • 2021-08-23
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多