日照一中提高二test试题分析.pptx

想预览更多内容,点击预览全文

申明敬告:

本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。如果您已付费下载过本站文档,您可以点击这里二次下载

文档介绍

试题分析;N个节点与n – 1条边构成的连通图

这是一棵树

求出从每个点出发能够到达的最远点

数据范围n <= 200000。;想法1:

枚举每个点,一遍dfs求出距离这个点最远的点。

枚举点时间复杂度O(n)

Dfs求最远点时间复杂度O(h),h为树的深度,随机数据下h是logn数量级的

构造数据可以使h很大;一条很长的链,链上伸出一些树枝。;于是上述算法的总时间复杂度可退化为O(n ^ 2),期望得分30~60。

考虑两个相邻的节点,其他节点到这两个节点的距离是非常接近的

当从一个节点枚举到另一个节点时,没有必要重新进行一次dfs;想法2:动态规划

随便取一个点为根,为方便起见,这里我们取1为根。

每个点的最优值可能是两种情况:

1、向上至根方向取到

2、向下至儿子方向取到;红色点的最优路径是红色路径

在fu[i]取到;红色点的最优路径是红色路径

在fd[i]取到;状态定义:

Fu[i]表示点i至根方向能够取到的最长距离

Fd[i]表示点i至儿子方向能够取到的最长距离;转移方程:

Fd[i] = max(fd[j] + w[i, j]), 其中i是j的父亲

从i向下必定会经过i的某个儿子j,所以取遍所有j更新fd[i]值;Fu[i] = max(fu[j], fd[j]) + w[i, j],其中j是i的父亲

从i向上必定要经过i的父亲j,到达j后可以选择继续向上或改变方向向下

但这样会有问题,如果fd[j]的最优值是在i处取到的,那么(i, j)这条边将会被计算两次;左右两图分别表示fu[4]和fd[2];根据我们的方程,有:

Fu[4] = fd[2] + w(4, 2),而这样会导致(4, 2)走过了两次,路径为4-2-4-6

问题在于点2处向下的路径经过了点4

;解决方法:

对于每个节点,记录向下的最远和次远距离

最远和次远的距离要在不同儿子处取到;点1

您可能关注的文档

最近下载