树的三大核心:
一·树的直径:
方法一:先随机选取一个点a(有时为了方便会选取根节点),求出a点到所有点的距离,然后找到距离此点最远的那个点b,再寻找距离b最远的距离即是数的直径。
方法二:有时问题不仅让我们求树的直径,并且让我们去求出所有直径上的点(树的直径不止一条),这是仅仅用第一种方法已经无法解决问题了,这时我们使用树形DP来解决问题,主要操作是从某节点(无向图选择根节点,有向图随便选取即可)dfs遍历整个树,对于每个节点设置向下遍历的最大值与次大值,可以知道这里应该是先递归到叶节点,在回溯的过程中所完成的,对于所有节点的最大值+次大值最大者一定为树的直径(因为直径肯定以某个点为根节点),但如何求出所有的直径呢?我们可以知道对于每个节点,它在不在树的直径上不仅取决于向下遍历的最大值与次大值,还与向上遍历的最大值有关。所以我们需要再用一个dfs来求出所有节点向上遍历的最大值,这里是在递归之前所求出的(若在回溯过程中求出,那么子节点所用到的就不是正确的了),并且对与所求节点来说如果父节点的最大值经过了自己那么所进行比较的就是次大值(所以需要记录一下每个节点它的最大值指向的是哪个节点)。当所有操作完成后,若一个节点在向下遍历的最大值与次大值与向下遍历的最大值,三者最大的两者相加为直径,那么该点就在直径中!
orz
tttttql
tql