真的还有好多东西要学啊......
定理:
选取树 $T$ 的任意一个点 $i$ ,则与 $i$ 距离最远的节点 $r$ 必定是树中一条直径的端点.
定理:
经过树上一点i的最长路径的长度,一定等于:
情况1. $i$ 所引领的子树中,最大深度与次大深度之和.
情况2. $i$ 所引领的子树中的最大深度,加上 $i$ 到 $j$ 的最长路径,其中 $j$ 是一个不属于 $i$ 这个子树的节点.
当 $i$ 是树根时, $i$ 没有父节点,于是只会是情况1.
定理:
树 $T$ 的直径长度一定能表示为树 $T$ 上某个点 $i$ 所引领的子树中,最大深度与次大深度之和.
即, $\exists_{i\in V(T)}\; diameter = LargestDepth(subtree \ o \! f \ i) + SecondLargestDepth(subtree \ o \! f \ i)$
由于直径只有一个值,并且两个深度之和代表了一条路径的长度,
于是有$\forall_{i\in V(T)} \; diameter \ge LargestDepth(subtree \ o \! f \ i) + SecondLargestDepth(subtree \ o \! f \ i)$
定理:
点 $i$ 在某条直径上,当且仅当存在一条经过点 $i$ 的路径,它的长度(大于)等于直径.
AC VIJOS 1476 求在直径上的所有点. 直径可能有多条.
1 #include 2 #include 3 #include 4 5 #include 6 #include 7 #include 8 #include 9 10 #include 11 #include 12 #include
View Code 自底向上DP的思路很巧妙.注意两个条件都要判断.