Number of Provinces — DFS on Adjacency Matrix

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem

There are n cities. An n x n isConnected matrix tells if city i and j are directly connected. Count the total number of provinces (connected components).


Approach — DFS on adjacency matrix

For each unvisited city, DFS through all its connected cities. Count DFS calls.

Time: O(n²) | Space: O(n)


Solutions

Python

class Solution:
    def findCircleNum(self, isConnected: list[list[int]]) -> int:
        n=len(isConnected); visited=[False]*n
        def dfs(i):
            visited[i]=True
            for j in range(n):
                if isConnected[i][j]==1 and not visited[j]: dfs(j)
        count=0
        for i in range(n):
            if not visited[i]: dfs(i); count+=1
        return count

C++

class Solution {
    void dfs(vector<vector<int>>& g, vector<bool>& vis, int i){
        vis[i]=true;
        for(int j=0;j<g.size();j++) if(g[i][j]==1&&!vis[j]) dfs(g,vis,j);
    }
public:
    int findCircleNum(vector<vector<int>>& g){
        int n=g.size(),cnt=0; vector<bool> vis(n,false);
        for(int i=0;i<n;i++) if(!vis[i]){dfs(g,vis,i);cnt++;}
        return cnt;
    }
};

Java — Union-Find

class Solution {
    int[] p;
    int find(int x){ return p[x]==x?x:(p[x]=find(p[x])); }
    public int findCircleNum(int[][] g){
        int n=g.length; p=new int[n];
        for(int i=0;i<n;i++) p[i]=i;
        int cnt=n;
        for(int i=0;i<n;i++) for(int j=i+1;j<n;j++)
            if(g[i][j]==1){int a=find(i),b=find(j);if(a!=b){p[a]=b;cnt--;}}
        return cnt;
    }
}

Complexity

  • Time: O(n²) | Space: O(n)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro