Skip to content

Commit f8e695b

Browse files
committed
add sol
1 parent 2600629 commit f8e695b

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

leetcode/daily/3372/sol.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# https://leetcode.com/problems/maximize-the-number-of-target-nodes-after-connecting-trees-i/description/
2+
3+
def build_graph(edges, n):
4+
graph = [[] for _ in range(n)]
5+
for a, b in edges:
6+
graph[a].append(b)
7+
graph[b].append(a)
8+
return graph
9+
10+
def dfs(graph, node, parent, depth):
11+
if depth < 0:
12+
return 0
13+
count = 1 # Đếm chính nó
14+
for neighbor in graph[node]:
15+
if neighbor != parent:
16+
count += dfs(graph, neighbor, node, depth - 1)
17+
return count
18+
19+
def max_target_nodes(edges1, edges2, k):
20+
n1 = len(edges1) + 1
21+
n2 = len(edges2) + 1
22+
graph1 = build_graph(edges1, n1)
23+
graph2 = build_graph(edges2, n2)
24+
25+
# Bước 1: Tìm số lượng lớn nhất các nút có thể reach được trong cây 2 với (k - 1) bước
26+
max_targets_tree2 = 0
27+
for i in range(n2):
28+
reachable = dfs(graph2, i, -1, k - 1)
29+
max_targets_tree2 = max(max_targets_tree2, reachable)
30+
31+
# Bước 2: Với mỗi nút trong cây 1, tính tổng số target nodes
32+
result = []
33+
for i in range(n1):
34+
reachable_in_tree1 = dfs(graph1, i, -1, k)
35+
total = reachable_in_tree1 + max_targets_tree2
36+
result.append(total)
37+
return result
38+
39+
# === MAIN TEST CASE ===
40+
if __name__ == "__main__":
41+
edges1 = [[0,1],[0,2],[2,3],[2,4]]
42+
edges2 = [[0,1],[0,2],[0,3],[2,7],[1,4],[4,5],[4,6]]
43+
k = 2
44+
45+
output = max_target_nodes(edges1, edges2, k)
46+
print("Output:", output) # Expected: [9, 7, 9, 8, 8]

leetcode/daily/3372/sol1.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# https://leetcode.com/problems/maximize-the-number-of-target-nodes-after-connecting-trees-i/description/
2+
3+
from typing import List
4+
5+
class Solution:
6+
def dfs(self, graph, node, parent, depth):
7+
if depth < 0:
8+
return 0
9+
count = 1
10+
for neighbor in graph[node]:
11+
if neighbor != parent:
12+
count += self.dfs(graph, neighbor, node, depth - 1)
13+
return count
14+
15+
def maxTargetNodes(self, edges1: List[List[int]], edges2: List[List[int]], k: int) -> List[int]:
16+
# Find the number of nodes by getting the maximum node index + 1
17+
n1 = max(max(edge[0], edge[1]) for edge in edges1) + 1 if edges1 else 0
18+
n2 = max(max(edge[0], edge[1]) for edge in edges2) + 1 if edges2 else 0
19+
20+
graph1 = [[] for _ in range(n1)]
21+
graph2 = [[] for _ in range(n2)]
22+
23+
for edge in edges1:
24+
graph1[edge[0]].append(edge[1])
25+
graph1[edge[1]].append(edge[0])
26+
27+
for edge in edges2:
28+
graph2[edge[0]].append(edge[1])
29+
graph2[edge[1]].append(edge[0])
30+
31+
max_targets_tree2 = 0
32+
for i in range(n2):
33+
reachable = self.dfs(graph2, i, -1, k - 1)
34+
max_targets_tree2 = max(max_targets_tree2, reachable)
35+
36+
result = []
37+
for i in range(n1):
38+
reachable_in_tree1 = self.dfs(graph1, i, -1, k)
39+
total = reachable_in_tree1 + max_targets_tree2
40+
result.append(total)
41+
return result
42+
43+
# === MAIN TEST CASE ===
44+
if __name__ == "__main__":
45+
sol = Solution()
46+
edges1 = [[0,1],[0,2],[2,3],[2,4]]
47+
edges2 = [[0,1],[0,2],[0,3],[2,7],[1,4],[4,5],[4,6]]
48+
k = 2
49+
print(sol.maxTargetNodes(edges1, edges2, k))

0 commit comments

Comments
 (0)