|  | 
| 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