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:

  1. 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;
    }
  1. 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);
            }
        }
    }
}