|
57 | 57 |
|
58 | 58 | ```Python
|
59 | 59 | class Solution:
|
60 | | - def __init__(self): |
61 | | - self.visited = 0 |
62 | | - self.diameter = 0 |
63 | | - |
64 | | - def dfs(self, graph, mask, u): |
65 | | - self.visited |= 1 << u # 标记 u 访问过 |
66 | | - u_len = 0 # u 节点的最大路径长度 |
67 | | - for v in graph[u]: # 遍历 u 节点的相邻节点 |
68 | | - if self.visited >> v & 1 == 0 and mask >> v & 1: # v 没有访问过,且在子集中 |
69 | | - v_len = self.dfs(graph, mask, v) # 相邻节点的最大路径长度 |
70 | | - self.diameter = max(self.diameter, u_len + v_len + 1) # 维护最大路径长度 |
71 | | - u_len = max(u_len, v_len + 1) # 更新 u 节点的最大路径长度 |
72 | | - return u_len |
73 | | - |
74 | | - |
75 | | - |
76 | 60 | def countSubgraphsForEachDiameter(self, n: int, edges: List[List[int]]) -> List[int]:
|
77 | | - # 建图 |
78 | | - graph = [[] for _ in range(n)] |
| 61 | + graph = [[] for _ in range(n)] # 建图 |
79 | 62 | for u, v in edges:
|
80 | 63 | graph[u - 1].append(v - 1)
|
81 | 64 | graph[v - 1].append(u - 1)
|
82 | 65 |
|
| 66 | + def dfs(mask, u): |
| 67 | + nonlocal visited, diameter |
| 68 | + visited |= 1 << u # 标记 u 访问过 |
| 69 | + u_len = 0 # u 节点的最大路径长度 |
| 70 | + for v in graph[u]: # 遍历 u 节点的相邻节点 |
| 71 | + if (visited >> v) & 1 == 0 and mask >> v & 1: # v 没有访问过,且在子集中 |
| 72 | + v_len = dfs(mask, v) # 相邻节点的最大路径长度 |
| 73 | + diameter = max(diameter, u_len + v_len + 1) # 维护最大路径长度 |
| 74 | + u_len = max(u_len, v_len + 1) # 更新 u 节点的最大路径长度 |
| 75 | + return u_len |
| 76 | + |
83 | 77 | ans = [0 for _ in range(n - 1)]
|
84 | 78 |
|
85 | | - |
86 | | - for mask in range(3, 1 << n): # 二进制枚举子集 |
87 | | - if mask & (mask - 1) == 0: # 子集至少需要两个点 |
| 79 | + for mask in range(3, 1 << n): # 二进制枚举子集 |
| 80 | + if mask & (mask - 1) == 0: # 子集至少需要两个点 |
88 | 81 | continue
|
89 | | - self.visited = 0 |
90 | | - self.diameter = 0 |
| 82 | + visited = 0 |
| 83 | + diameter = 0 |
91 | 84 | u = mask.bit_length() - 1
|
92 | | - self.dfs(graph, mask, u) # 在子集 mask 中递归求树的直径 |
93 | | - if self.visited == mask: |
94 | | - ans[self.diameter - 1] += 1 |
| 85 | + dfs(mask, u) # 在子集 mask 中递归求树的直径 |
| 86 | + if visited == mask: |
| 87 | + ans[diameter - 1] += 1 |
95 | 88 | return ans
|
96 | 89 | ```
|
97 | 90 |
|
|
0 commit comments