100475. 连接两棵树后最大目标节点数目 I
有两棵 无向 树,分别有 n
和 m
个树节点。两棵树中的节点编号分别为[0, n - 1]
和 [0, m - 1]
中的整数。
给你两个二维整数 edges1
和 edges2
,长度分别为 n - 1
和 m - 1
,其中 edges1[i] = [ai, bi]
表示第一棵树中节点 ai
和 bi
之间有一条边,edges2[i] = [ui, vi]
表示第二棵树中节点 ui
和 vi
之间有一条边。同时给你一个整数 k
。
如果节点 u
和节点 v
之间路径的边数小于等于 k
,那么我们称节点 u
是节点 v
的 目标节点 。注意 ,一个节点一定是它自己的 目标节点 。
请你返回一个长度为 n
的整数数组 answer
,answer[i]
表示将第一棵树中的一个节点与第二棵树中的一个节点连接一条边后,第一棵树中节点 i
的 目标节点 数目的 最大值 。
注意 ,每个查询相互独立。意味着进行下一次查询之前,你需要先把刚添加的边给删掉。
示例 1:
输入:edges1 = [[0,1],[0,2],[2,3],[2,4]], edges2 = [[0,1],[0,2],[0,3],[2,7],[1,4],[4,5],[4,6]], k = 2
输出:[9,7,9,8,8]
解释:
i = 0
,连接第一棵树中的节点 0 和第二棵树中的节点 0 。i = 1
,连接第一棵树中的节点 1 和第二棵树中的节点 0 。i = 2
,连接第一棵树中的节点 2 和第二棵树中的节点 4 。i = 3
,连接第一棵树中的节点 3 和第二棵树中的节点 4 。i = 4
,连接第一棵树中的节点 4 和第二棵树中的节点 4 。示例 2:
输入:edges1 = [[0,1],[0,2],[0,3],[0,4]], edges2 = [[0,1],[1,2],[2,3]], k = 1
输出:[6,3,3,3,3]
解释:
对于每个 i
,连接第一棵树中的节点 i
和第二棵树中的任意一个节点。
提示:
2 <= n, m <= 1000
edges1.length == n - 1
edges2.length == m - 1
edges1[i].length == edges2[i].length == 2
edges1[i] = [ai, bi]
0 <= ai, bi < n
edges2[i] = [ui, vi]
0 <= ui, vi < m
edges1
和 edges2
都表示合法的树。0 <= k <= 1000
相似题目
原站题解
golang 解法, 执行用时: 92 ms, 内存消耗: 8.7 MB, 提交时间: 2024-12-09 09:23:08
func buildTree(edges [][]int, k int) func(int, int, int) int { g := make([][]int, len(edges)+1) for _, e := range edges { x, y := e[0], e[1] g[x] = append(g[x], y) g[y] = append(g[y], x) } var dfs func(int, int, int) int dfs = func(x, fa, d int) int { if d > k { return 0 } cnt := 1 for _, y := range g[x] { if y != fa { cnt += dfs(y, x, d+1) } } return cnt } return dfs } func maxTargetNodes(edges1, edges2 [][]int, k int) []int { max2 := 0 if k > 0 { dfs := buildTree(edges2, k-1) // 注意这里传的是 k-1 for i := range len(edges2) + 1 { max2 = max(max2, dfs(i, -1, 0)) } } dfs := buildTree(edges1, k) ans := make([]int, len(edges1)+1) for i := range ans { ans[i] = dfs(i, -1, 0) + max2 } return ans }
java 解法, 执行用时: 320 ms, 内存消耗: 45 MB, 提交时间: 2024-12-09 09:22:50
class Solution { public int[] maxTargetNodes(int[][] edges1, int[][] edges2, int k) { int max2 = 0; if (k > 0) { List<Integer>[] g = buildTree(edges2); for (int i = 0; i < edges2.length + 1; i++) { max2 = Math.max(max2, dfs(i, -1, 0, g, k - 1)); // 注意这里传的是 k-1 } } List<Integer>[] g = buildTree(edges1); int[] ans = new int[edges1.length + 1]; for (int i = 0; i < ans.length; i++) { ans[i] = dfs(i, -1, 0, g, k) + max2; } return ans; } private List<Integer>[] buildTree(int[][] edges) { List<Integer>[] g = new ArrayList[edges.length + 1]; Arrays.setAll(g, i -> new ArrayList<>()); for (int[] e : edges) { int x = e[0]; int y = e[1]; g[x].add(y); g[y].add(x); } return g; } private int dfs(int x, int fa, int d, List<Integer>[] g, int k) { if (d > k) { return 0; } int cnt = 1; for (int y : g[x]) { if (y != fa) { cnt += dfs(y, x, d + 1, g, k); } } return cnt; } }
cpp 解法, 执行用时: 143 ms, 内存消耗: 57.8 MB, 提交时间: 2024-12-09 09:22:37
class Solution { vector<vector<int>> buildTree(vector<vector<int>>& edges) { vector<vector<int>> g(edges.size() + 1); for (auto& e : edges) { int x = e[0], y = e[1]; g[x].push_back(y); g[y].push_back(x); } return g; } int dfs(int x, int fa, int d, vector<vector<int>>& g, int k) { if (d > k) { return 0; } int cnt = 1; for (int y : g[x]) { if (y != fa) { cnt += dfs(y, x, d + 1, g, k); } } return cnt; } public: vector<int> maxTargetNodes(vector<vector<int>>& edges1, vector<vector<int>>& edges2, int k) { int max2 = 0; if (k > 0) { auto g = buildTree(edges2); for (int i = 0; i < edges2.size() + 1; i++) { max2 = max(max2, dfs(i, -1, 0, g, k - 1)); // 注意这里传的是 k-1 } } auto g = buildTree(edges1); vector<int> ans(edges1.size() + 1); for (int i = 0; i < ans.size(); i++) { ans[i] = dfs(i, -1, 0, g, k) + max2; } return ans; } };
python3 解法, 执行用时: 1655 ms, 内存消耗: 18.4 MB, 提交时间: 2024-12-09 09:22:23
class Solution: def buildTree(self, edges: list[list[int]], k: int) -> Callable[[int, int, int], int]: g = [[] for _ in range(len(edges) + 1)] for x, y in edges: g[x].append(y) g[y].append(x) def dfs(x: int, fa: int, d: int) -> int: if d > k: return 0 cnt = 1 for y in g[x]: if y != fa: cnt += dfs(y, x, d + 1) return cnt return dfs def maxTargetNodes(self, edges1: List[List[int]], edges2: List[List[int]], k: int) -> List[int]: max2 = 0 if k: dfs = self.buildTree(edges2, k - 1) # 注意这里传的是 k-1 max2 = max(dfs(i, -1, 0) for i in range(len(edges2) + 1)) dfs = self.buildTree(edges1, k) return [dfs(i, -1, 0) + max2 for i in range(len(edges1) + 1)]