Skip to content

Commit 4968d4a

Browse files
committed
Improved task 3367
1 parent 3c0e0a7 commit 4968d4a

File tree

1 file changed

+35
-20
lines changed
  • src/main/java/g3301_3400/s3367_maximize_sum_of_weights_after_edge_removals

1 file changed

+35
-20
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,51 @@
11
package g3301_3400.s3367_maximize_sum_of_weights_after_edge_removals;
22

3-
// #Hard #2024_11_24_Time_147_ms_(100.00%)_Space_142.2_MB_(100.00%)
3+
// #Hard #2024_11_27_Time_87_ms_(98.35%)_Space_152.7_MB_(18.13%)
44

55
import java.util.ArrayList;
6-
import java.util.HashMap;
6+
import java.util.List;
77
import java.util.PriorityQueue;
88

99
public class Solution {
10+
private List<int[]>[] adj;
11+
private int k;
12+
1013
public long maximizeSumOfWeights(int[][] edges, int k) {
11-
HashMap<Integer, ArrayList<int[]>> map = new HashMap<>();
12-
for (int[] edge : edges) {
13-
map.computeIfAbsent(edge[0], t -> new ArrayList<>()).add(new int[] {edge[1], edge[2]});
14-
map.computeIfAbsent(edge[1], t -> new ArrayList<>()).add(new int[] {edge[0], edge[2]});
14+
int n = edges.length + 1;
15+
adj = new List[n];
16+
this.k = k;
17+
for (int i = 0; i < n; i++) {
18+
adj[i] = new ArrayList<>();
19+
}
20+
for (int[] e : edges) {
21+
adj[e[0]].add(e);
22+
adj[e[1]].add(e);
1523
}
16-
return maximizeSumOfWeights(0, -1, k, map)[0];
24+
return dfs(0, -1)[1];
1725
}
1826

19-
private long[] maximizeSumOfWeights(
20-
int v, int from, int k, HashMap<Integer, ArrayList<int[]>> map) {
27+
private long[] dfs(int v, int parent) {
2128
long sum = 0;
22-
PriorityQueue<Long> queue = new PriorityQueue<>();
23-
for (int[] i : map.get(v)) {
24-
if (i[0] != from) {
25-
long[] next = maximizeSumOfWeights(i[0], v, k, map);
26-
next[1] += i[1];
27-
sum += Math.max(next[0], next[1]);
28-
if (next[0] < next[1]) {
29-
queue.offer(next[1] - next[0]);
30-
sum -= queue.size() > k ? queue.poll() : 0;
31-
}
29+
PriorityQueue<Long> pq = new PriorityQueue<>();
30+
for (int[] e : adj[v]) {
31+
int w = e[0] == v ? e[1] : e[0];
32+
if (w == parent) {
33+
continue;
3234
}
35+
long[] res = dfs(w, v);
36+
long max = Math.max(e[2] + res[0], res[1]);
37+
sum += max;
38+
pq.add(max - res[1]);
39+
}
40+
long[] res = new long[2];
41+
while (pq.size() > k) {
42+
sum -= pq.poll();
43+
}
44+
res[1] = sum;
45+
while (pq.size() > k - 1) {
46+
sum -= pq.poll();
3347
}
34-
return new long[] {sum, sum - (queue.size() < k ? 0 : queue.peek())};
48+
res[0] = sum;
49+
return res;
3550
}
3651
}

0 commit comments

Comments
 (0)