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:
k
other nodes, where k
is given.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:
[0, 2, 2]
, ensuring that no node has edges with more than k = 2
nodes.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:
k = 3
nodes, we don’t remove any edges.Constraints:
2 <= n <= 105
1 <= k <= n - 1
edges.length == n - 1
edges[i].length == 3
0 <= edges[i][0] <= n - 1
0 <= edges[i][1] <= n - 1
1 <= edges[i][2] <= 106
edges
form a valid tree.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
}
}