There are n cities. Some of them are connected, while some are not. If city a is connected directly with city b, and city b is connected directly with city c, then city a is connected indirectly with city c.
A province is a group of directly or indirectly connected cities and no other cities outside of the group.
You are given an n x n matrix isConnected where isConnected[i][j] = 1 if the ith city and the jth city are directly connected, and isConnected[i][j] = 0 otherwise.
Return the total number of provinces.
Input: isConnected = [[1,1,0],[1,1,0],[0,0,1]]
Output: 2
Input: isConnected = [[1,0,0],[0,1,0],[0,0,1]]
Output: 3
1 <= n <= 200n == isConnected.lengthn == isConnected[i].lengthisConnected[i][j] is 1 or 0.isConnected[i][i] == 1isConnected[i][j] == isConnected[j][i]The problem can be conceptualized as finding connected components in an undirected graph. Each city is a node, and a direct road between two cities is an edge. Using Depth-First Search, we can explore all nodes (i.e., cities) connected to a starting node, marking them as visited. Each new unvisited node indicates the start of a new province.
Similar to the DFS approach, we aim to find connected components. However, BFS uses a queue to explore all nodes extensively level by level. Whenever we find a new city that hasn't been visited, we add it to the queue and mark it as part of the same province.
Union-Find efficiently tracks and merges disjoint sets, or connected components, which suits this problem perfectly. Initially, each city is its own province. As we process direct roads between cities, we union their sets. The number of unique roots in the Union-Find structure at the end will give us the number of provinces.