|
1 | 1 | package g3301_3400.s3367_maximize_sum_of_weights_after_edge_removals;
|
2 | 2 |
|
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%) |
4 | 4 |
|
5 | 5 | import java.util.ArrayList;
|
6 |
| -import java.util.HashMap; |
| 6 | +import java.util.List; |
7 | 7 | import java.util.PriorityQueue;
|
8 | 8 |
|
9 | 9 | public class Solution {
|
| 10 | + private List<int[]>[] adj; |
| 11 | + private int k; |
| 12 | + |
10 | 13 | 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); |
15 | 23 | }
|
16 |
| - return maximizeSumOfWeights(0, -1, k, map)[0]; |
| 24 | + return dfs(0, -1)[1]; |
17 | 25 | }
|
18 | 26 |
|
19 |
| - private long[] maximizeSumOfWeights( |
20 |
| - int v, int from, int k, HashMap<Integer, ArrayList<int[]>> map) { |
| 27 | + private long[] dfs(int v, int parent) { |
21 | 28 | 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; |
32 | 34 | }
|
| 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(); |
33 | 47 | }
|
34 |
| - return new long[] {sum, sum - (queue.size() < k ? 0 : queue.peek())}; |
| 48 | + res[0] = sum; |
| 49 | + return res; |
35 | 50 | }
|
36 | 51 | }
|
0 commit comments