LeetCode in Kotlin

3419. Minimize the Maximum Edge Weight of Graph

Medium

You are given two integers, n and threshold, as well as a directed weighted graph of n nodes numbered from 0 to n - 1. The graph is represented by a 2D integer array edges, where edges[i] = [Ai, Bi, Wi] indicates that there is an edge going from node Ai to node Bi with weight Wi.

You have to remove some edges from this graph (possibly none), so that it satisfies the following conditions:

Return the minimum possible value of the maximum edge weight after removing the necessary edges. If it is impossible for all conditions to be satisfied, return -1.

Example 1:

Input: n = 5, edges = [[1,0,1],[2,0,2],[3,0,1],[4,3,1],[2,1,1]], threshold = 2

Output: 1

Explanation:

Remove the edge 2 -> 0. The maximum weight among the remaining edges is 1.

Example 2:

Input: n = 5, edges = [[0,1,1],[0,2,2],[0,3,1],[0,4,1],[1,2,1],[1,4,1]], threshold = 1

Output: -1

Explanation:

It is impossible to reach node 0 from node 2.

Example 3:

Input: n = 5, edges = [[1,2,1],[1,3,3],[1,4,5],[2,3,2],[3,4,2],[4,0,1]], threshold = 1

Output: 2

Explanation:

Remove the edges 1 -> 3 and 1 -> 4. The maximum weight among the remaining edges is 2.

Example 4:

Input: n = 5, edges = [[1,2,1],[1,3,3],[1,4,5],[2,3,2],[4,0,1]], threshold = 1

Output: -1

Constraints:

Solution

import java.util.LinkedList
import java.util.Queue
import kotlin.math.max

@Suppress("unused")
class Solution {
    fun minMaxWeight(n: Int, edges: Array<IntArray>, threshold: Int): Int {
        val reversedG: Array<MutableList<IntArray>?> = arrayOfNulls<MutableList<IntArray>?>(n)
        for (i in 0..<n) {
            reversedG[i] = ArrayList<IntArray>()
        }
        for (i in edges) {
            val a = i[0]
            val b = i[1]
            val w = i[2]
            reversedG[b]!!.add(intArrayOf(a, w))
        }
        val distance = IntArray(n)
        distance.fill(Int.Companion.MAX_VALUE)
        distance[0] = 0
        if (reversedG[0]!!.isEmpty()) {
            return -1
        }
        val que: Queue<Int?> = LinkedList<Int?>()
        que.add(0)
        while (que.isNotEmpty()) {
            val cur: Int = que.poll()!!
            for (next in reversedG[cur]!!) {
                val node = next[0]
                val w = next[1]
                val nextdis = max(w, distance[cur])
                if (nextdis < distance[node]) {
                    distance[node] = nextdis
                    que.add(node)
                }
            }
        }
        var ans = 0
        for (i in 0..<n) {
            if (distance[i] == Int.Companion.MAX_VALUE) {
                return -1
            }
            ans = max(ans, distance[i])
        }
        return ans
    }
}