Question:
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.
Example 1:
Open: Screenshot 2024-06-21 at 5.19.11 PM.png
Input: isConnected = [[1,1,0],[1,1,0],[0,0,1]] Output: 2
Example 2:
Open: Screenshot 2024-06-21 at 5.19.32 PM.png
Input: isConnected = [[1,0,0],[0,1,0],[0,0,1]] Output: 3
Solution:
- Union Find
For Disjoint Set class copy template from UNION BY RANK (LESS INTUITIVE).
public int findCircleNum(int[][] isConnected) {
int V = isConnected.length;
DisjointSet dsu = new DisjointSet(V);
for(int i = 0; i < V; i++){
for(int j = 0; j < V; j++){
if(isConnected[i][j] == 1){
dsu.unionByRank(i, j);
}
}
}
int count = 0;
for(int i = 0; i < V; i++){
if(dsu.findUltimateParent(i) == i){
count++;
}
}
return count;
}
- DFS
class Solution {
public int findCircleNum(int[][] isConnected) {
boolean[] vis = new boolean[isConnected.length];
int count = 0;
for(int sr = 0; sr < isConnected.length; sr++){
if(!vis[sr]){
dfs(isConnected, sr, vis);
count++;
}
}
return count;
}
public void dfs(int[][] isConnected, int sr, boolean[] vis){
if(vis[sr])
return;
vis[sr] = true;
for(int nbr = 1; nbr < isConnected[sr].length; nbr++){
if(isConnected[sr][nbr] == 1 && !vis[nbr]){
dfs(isConnected, nbr, vis);
}
}
}
}