All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g3301_3400.s3310_remove_methods_from_project.Solution.kt Maven / Gradle / Ivy

package g3301_3400.s3310_remove_methods_from_project

// #Medium #Depth_First_Search #Breadth_First_Search #Graph
// #2024_10_12_Time_1465_ms_(100.00%)_Space_201.7_MB_(14.81%)

class Solution {
    private lateinit var graph: Array
    private lateinit var suspicious: BooleanArray
    private lateinit var visited: BooleanArray

    fun remainingMethods(n: Int, k: Int, invocations: Array): List {
        pack(invocations, n)
        suspicious = BooleanArray(n)
        visited = BooleanArray(n)
        dfs(k, true)
        visited.fill(false)
        for (i in 0 until n) {
            if (!suspicious[i] && dfs2(i)) {
                visited.fill(false)
                dfs(k, false)
                break
            }
        }
        val rst = ArrayList()
        for (i in 0 until n) {
            if (!suspicious[i]) {
                rst.add(i)
            }
        }
        return rst
    }

    fun dfs(u: Int, sus: Boolean) {
        if (visited[u]) {
            return
        }
        visited[u] = true
        suspicious[u] = sus
        for (v in graph[u]!!) {
            dfs(v, sus)
        }
    }

    fun dfs2(u: Int): Boolean {
        if (suspicious[u]) {
            return true
        }
        if (visited[u]) {
            return false
        }
        visited[u] = true
        for (v in graph[u]!!) {
            if (dfs2(v)) {
                return true
            }
        }
        return false
    }

    private fun pack(edges: Array, n: Int) {
        val adj = IntArray(n)
        for (edge in edges) {
            adj[edge[0]]++
        }
        graph = arrayOfNulls(n)
        for (i in 0 until n) {
            graph[i] = IntArray(adj[i])
        }
        for (edge in edges) {
            graph[edge[0]]!![--adj[edge[0]]] = edge[1]
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy