LeetCode in Kotlin

2685. Count the Number of Complete Components

Medium

You are given an integer n. There is an undirected graph with n vertices, numbered from 0 to n - 1. You are given a 2D integer array edges where edges[i] = [ai, bi] denotes that there exists an undirected edge connecting vertices ai and bi.

Return the number of complete connected components of the graph.

A connected component is a subgraph of a graph in which there exists a path between any two vertices, and no vertex of the subgraph shares an edge with a vertex outside of the subgraph.

A connected component is said to be complete if there exists an edge between every pair of its vertices.

Example 1:

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

Output: 3

Explanation: From the picture above, one can see that all of the components of this graph are complete.

Example 2:

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

Output: 1

Explanation: The component containing vertices 0, 1, and 2 is complete since there is an edge between every pair of two vertices. On the other hand, the component containing vertices 3, 4, and 5 is not complete since there is no edge between vertices 4 and 5. Thus, the number of complete components in this graph is 1.

Constraints:

Solution

@Suppress("NAME_SHADOWING")
class Solution {
    fun countCompleteComponents(n: Int, edges: Array<IntArray>): Int {
        val adj = HashMap<Int, ArrayList<Int>>().apply {
            for ((u, v) in edges) {
                this[u] = getOrDefault(u, arrayListOf()).apply { add(v) }
                this[v] = getOrDefault(v, arrayListOf()).apply { add(u) }
            }
        }
        val visited = BooleanArray(n)
        fun bfs(i: Int): Pair<Int, Int> {
            if (visited[i]) return 0 to 0
            visited[i] = true
            var nodes = 1
            var edges = (adj[i]?.size ?: 0)
            adj[i]?.forEach {
                val (nodes2, edges2) = bfs(it)
                nodes += nodes2
                edges += edges2
            }
            return nodes to edges
        }
        var res = 0
        for (i in 0 until n) {
            if (!visited[i]) {
                val (nodes, edges) = bfs(i)
                if ((nodes * (nodes - 1)) == edges) {
                    res++
                }
            }
        }
        return res
    }
}