3372 - Maximize the Number of Target Nodes After Connecting Trees I
정보
- 문제 보기: 3372 - Maximize the Number of Target Nodes After Connecting Trees I
- 소요 시간: 46분 26초
- 풀이 언어:
java - 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
dfs
풀이 코드
정보
- 메모리: 46760 KB
- 시간: 279 ms
class Solution {
List<Integer>[] adj1, adj2;
boolean[] vis1, vis2;
int n, m, k;
public int dfs1(int i, int depth) { // tree 1
if (depth > k) return 0;
int res = 1;
for (int nxt : adj1[i]) {
vis1[i] = true;
if (!vis1[nxt]) res += dfs1(nxt, depth+1);
vis1[i] = false;
}
return res;
}
public int dfs2(int j, int depth) { // tree 2
if (depth > k-1) return 0;
int res = 1;
for (int nxt : adj2[j]) {
vis2[j] = true;
if (!vis2[nxt]) res += dfs2(nxt, depth+1);
vis2[j] = false;
}
return res;
}
public int[] maxTargetNodes(int[][] edges1, int[][] edges2, int k) {
this.n = edges1.length + 1;
this.m = edges2.length + 1;
this.k = k;
// init adj
this.adj1 = new ArrayList[n];
this.adj2 = new ArrayList[m];
for (int i = 0; i < n; ++i) adj1[i] = new ArrayList<>();
for (int j = 0; j < m; ++j) adj2[j] = new ArrayList<>();
for (int[] e : edges1) {
adj1[e[0]].add(e[1]);
adj1[e[1]].add(e[0]);
}
for (int[] e : edges2) {
adj2[e[0]].add(e[1]);
adj2[e[1]].add(e[0]);
}
// init visited
vis1 = new boolean[n];
vis2 = new boolean[m];
// dfs
int[] ans = new int[n];
int mx = 0; // get maximum tree 2 nodes of distance k
for (int j = 0; j < m; ++j)
mx = Math.max(mx, dfs2(j, 0));
for (int i = 0; i < n; ++i) {
// count tree 1 nodes of distance k
ans[i] = dfs1(i, 0) + mx;
}
return ans;
}
}
풀이 해설
tree1의 특정 노드 i를 tree2의 노드에 연결했을 때, i로부터의 거리가 k 이하인 최대 노드 수를 구하는 문제이다.
정확히는 tree1의 모든 노드에 대하여 구해야되기 때문에 반환형이 int가 아니고 int[]이다.
지문이 좀 난독증 오는데 댓글에서 사람들이 남긴 설명을 읽어보면 그제서야 이해된다.
By maximum possible number of nodes target to node i of the first tree, it means how many nodes are less than k edges away from node i of the first tree.
For Example 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
For i = 0, connect node 0 from the first tree to node 0 from the second tree.
If there is an edge from node 0 of tree1 and node 0 of tree2
Here are the nodes k edges away to node 0 of tree1:
from tree1: [0,1,2,3,4]
from tree2: [0,2,3,1]
For a total of 9 nodes