给定一棵树的每个叶子节点到其他叶子节点的最短距离,求这棵树上所有边的距离和。用叶子节点表示某一个物种,叶子节点之间的距离表示某一物种和另一物种之间差异,用树来描述是因为用树来描述满足物种差异性的三角关系M(i,k)+M(k,j)>=M(i,j)。这种树可能就叫做进化树吧,那么树上所有边的距离和就应该表示整个生物界物种多样性的程度了。
回归到正题:给定一棵树的每个叶子节点到其他叶子节点的最短距离,求这棵树上所有边的距离和。首先考虑一下简单的情况,假设只有两个节点,那么树的距离和就是这两个节点的最短距离。如果存在三个节点呢?其中一个节点一定通过若干内节点(三个节点时最多两个)与其他两个节点相连,也就是说从这个节点有两条路径分别连接到其他两个节点,这两条路径的距离是已知的且两条路径都通过这个节点与最近的那个内节点之间的边。如果把这个边去掉就成了两个节点的情况了,而这种情况是可计算的,这样就降低了问题的规模。剩下的问题是如何计算这个节点与最近的那个内节点之间的边。设x,y,z分别为三个节点,那么x到最近内节点的距离就是{M(x,y)+M(x,z)-M(y,z)}/2。
考虑多余三个节点的情况,可以通过去掉边的方式缩小问题规模,但是每次要保证去掉的是节点到最近内节点的边,那么可以通过枚举y和z来找到最小值,这样是O(n^2)的,加上去掉O(n)条边一共是O(n^3),但是画一个复杂的树尝试一下就发现固定一个叶子y,枚举z就可以找到节点x到最近内节点的边,至于为什么没多想,这样就可以使问题降到O(n^2)。