加权边缘树的中心(可能为负)

时间:2015-01-11 07:42:43

标签: algorithm graph tree graph-algorithm weighted

我之前已经看到过这个问题,对于没有加权的树木和具有正边缘权重的树木,但是没有看到可能具有负重量的树木的解决方案。

作为参考,树的中心被定义为最小化到任何其他顶点的最大距离的顶点。

1 个答案:

答案 0 :(得分:1)

与具有正边缘权重的树的动态编程解决方案完全相同。让我们先运行深度搜索两次(我们可以选择一个任意顶点作为根)。在第一阶段,我们将计算distIn(v) = the longest distance from v to a vertex from the v's subtree.我认为这部分是微不足道的(如果有必要我可以详细说明)。在第二阶段,我们将计算不在{​​{1}}子树内的所有v的最远顶点。我们称之为v。这是一个伪代码:

distOut(v)

每个顶点的最大距离为void computeDistOut(v, pathFromParent) distOut(v) = pathFromParent childDists = empty list for c : children of v childDists.add(distIn(c) + cost(v, c)) for c : children of v maxDist = max among all distances from childDists except (distIn(c) + cost(v, c)) computeDistOut(c, max(pathFromParent, maxDist) + cost(v, c)) 。现在我们可以选择一个最小化该值的顶点(它是定义的中心)。

关于时间复杂度:如果正确实施此解决方案,则它是线性的。我们可以在其中存储两个最大值,而不是维护所有子节点的距离列表(伪代码中为max(distIn(v), distOut(v)))。它允许我们在childDists中获取maxDist值(它是第一个或第二个最大值)。