LeetCode in Kotlin

3367. Maximize Sum of Weights after Edge Removals

Hard

There exists an undirected tree with n nodes numbered 0 to n - 1. You are given a 2D integer array edges of length n - 1, where edges[i] = [ui, vi, wi] indicates that there is an edge between nodes ui and vi with weight wi in the tree.

Your task is to remove zero or more edges such that:

Return the maximum possible sum of weights for the remaining edges after making the necessary removals.

Example 1:

Input: edges = [[0,1,4],[0,2,2],[2,3,12],[2,4,6]], k = 2

Output: 22

Explanation:

Example 2:

Input: edges = [[0,1,5],[1,2,10],[0,3,15],[3,4,20],[3,5,5],[0,6,10]], k = 3

Output: 65

Explanation:

Constraints:

Solution

import java.util.PriorityQueue
import kotlin.math.max

class Solution {
    private lateinit var adj: Array<MutableList<IntArray>>
    private var k = 0

    fun maximizeSumOfWeights(edges: Array<IntArray>, k: Int): Long {
        val n = edges.size + 1
        adj = Array(n) { ArrayList<IntArray>() }
        this.k = k
        for (i in 0..<n) {
            adj[i] = ArrayList<IntArray>()
        }
        for (e in edges) {
            adj[e[0]].add(e)
            adj[e[1]].add(e)
        }
        return dfs(0, -1)[1]
    }

    private fun dfs(v: Int, parent: Int): LongArray {
        var sum: Long = 0
        val pq = PriorityQueue<Long?>()
        for (e in adj[v]) {
            val w = if (e[0] == v) e[1] else e[0]
            if (w == parent) {
                continue
            }
            val res = dfs(w, v)
            val max = max(e[2] + res[0], res[1])
            sum += max
            pq.add(max - res[1])
        }
        val res = LongArray(2)
        while (pq.size > k) {
            sum -= pq.poll()!!
        }
        res[1] = sum
        while (pq.size > k - 1) {
            sum -= pq.poll()!!
        }
        res[0] = sum
        return res
    }
}