Java教程

【笔记】树形dp

本文主要是介绍【笔记】树形dp,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录:

(一)简介

(二)例题

 

(一)简介:

(1)树是什么?

  树是⼀种⼗分优美的数据结构,因为它本身就具有的递归性,所 以树和⼦树之间能相互传递很多信息。

  树上的许多特征都可以通过它的⼦树的对应特征计算获得。

  所以树做动态规划求最优解和做统计非常⽅便。

(2)树的定义:

  n 个点,n-1 条边的⽆向连通图称为树。

(3)相关概念:

  结点?

  叶节点和分支节点?

  结点的度?结点的连边数

  树的度数?结点的度的最⼤值

  

  祖先和⼦孙?

  森林?

  结点深度,树⾼,⼦树⼤小?

 

(二)例题:

(1)给定⼀棵 n 个点的⽆权树,问树中每个⼦树的⼤小,每个节点的 深度? 其中 0 ≤ n ≤ 10^5

(2)给定⼀棵 n 个点的点权树,问树中每个⼦树的点权和,点权最⼤ 值? 其中 0 ≤ n ≤ 10^5

(3)给定⼀棵 n 个点的⽆权树,求树的重⼼?

  重⼼:删去该点之后,图中的所有连通块的最⼤尺⼨最小。 其中 0 ≤ n ≤ 10^5

(4)给定⼀棵 n 个点的边权树,问树中每个⼦树的最长链?次长链? 其中 0 ≤ n ≤ 10^5

(5)给定⼀棵 n 个点的边权树,对于树中每个节点 i,询问其到其它所有结点的距离和。 其中 0 ≤ n ≤ 10^5

(6)给定⼀棵 n 个点的边权树,求树的直径。 其中 0 ≤ n ≤ 10^5

  做法一:

    树的直径⼀定为某个点到其不同⼦树叶⼦的最长链 + 次长链

    暴力求解,从每个点开始遍历图,可以得到每个点v所在的最长路径max1和次长路径max2,注意的是最长路径和次长路径除了点v没有其他公共结点。

    时间复杂度为O ( n 2 ) O(n^2)O(n^2)

  做法二:

     选择⼀个点 X,求出其最远点 Y,再求 Y 的最远点 Z,则 YZ 为 直径

    (反证法:分X在直径UV上,和不在直径UV上两种情况)

    两遍DFS(或者BFS)就行

(7)给定⼀棵 n 个点的⽆权树,求其每个⼦树的重⼼。

  ⼦树重⼼定义为,删去该点之后,⼦树的所有连通块⼤小均不超过 n/2 其中 0 ≤ n ≤ 10^5

(8)没有上司的舞会:

(9)二叉苹果树

 

这篇关于【笔记】树形dp的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!