Skip to content

Commit 72e7c4c

Browse files
committed
feature:增加树形dp模板题
1 parent 794ecb1 commit 72e7c4c

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# 给定树结构,获得以所有节点为根时对应的树的深度,结果以列表返回
2+
def get(edges: List[List[int]]) -> List[int]:
3+
n = len(edges) + 1
4+
g = [[] for _ in range(n)]
5+
for x, y in edges:
6+
g[x].append(y)
7+
g[y].append(x)
8+
9+
# f[i] 当前节点为根时的最大深度和次大深度
10+
f = [[0, 0] for _ in range(n)]
11+
12+
# 当前树直径
13+
def dfs(u, fa):
14+
max_len = 0
15+
second_len = 0
16+
for v in g[u]:
17+
if v == fa: continue
18+
d = dfs(v, u) + 1
19+
if d >= max_len:
20+
second_len = max_len
21+
max_len = d
22+
elif d > second_len:
23+
second_len = d
24+
f[u] = [max_len, second_len]
25+
return max_len
26+
27+
dfs(0, -1)
28+
29+
# 所有节点中最大深度的最小值
30+
mnd = inf
31+
def rdfs(u, fa):
32+
nonlocal mnd
33+
# 最大深度,次大深度
34+
mx, smx = f[u]
35+
mnd = min(mx, mnd)
36+
for v in g[u]:
37+
if v == fa: continue
38+
# 如果当前v的最大深度 + 1刚好是它父亲u的最大深度,那么不能通过最大深度来更新,而是应该通过次大深度更新
39+
t = smx if f[v][0] + 1 == mx else mx
40+
if t + 1 >= f[v][0]: # 大于最大,更新最大和次大
41+
f[v][1], f[v][0] = f[v][0], t + 1
42+
elif t + 1 > f[v][1]: # 大于次大,只需要更新次大
43+
f[v][1] = t + 1
44+
rdfs(v, u)
45+
46+
rdfs(0, -1)
47+
48+
return [d for d, _ in f]

算法/dp/树的直径.py renamed to 算法/dp/树形dp/树的直径.py

-2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ def dfs(u, fa):
2929

3030

3131
# 只记录最长
32-
33-
3432
class Solution:
3533
def treeDiameter(self, edges: List[List[int]]) -> int:
3634
n = len(edges) + 1

0 commit comments

Comments
 (0)