Approach:
Treat already cluster of 1s as a whole component,
Make Disjoint set of that
Now for every zero, Try to find adjacent compoenets and add to check if
answer increases
One thing to node *** Size[i] denotes number of nodes in that component in DS
Also, store ultimate parent of all neoghbours in set, while traversing for zeros
To avoid multiple values of same compoenets
Atlast, Traverse again for no zero case, to get final anwer
TC = N^2
C++
class DisjointSet {
public:
vector<int> rank, parent, size;
DisjointSet(int n) {
rank.resize(n+1, 0);
parent.resize(n+1);
size.resize(n+1);
for(int i = 0;i<=n;i++) {
parent[i] = i;
size[i] = 1;
}
}
int findUPar(int node) {
if(node == parent[node])
return node;
return parent[node] = findUPar(parent[node]);
}
void unionByRank(int u, int v) {
int ulp_u = findUPar(u);
int ulp_v = findUPar(v);
if(ulp_u == ulp_v) return;
if(rank[ulp_u] < rank[ulp_v]) {
parent[ulp_u] = ulp_v;
}
else if(rank[ulp_v] < rank[ulp_u]) {
parent[ulp_v] = ulp_u;
}
else {
parent[ulp_v] = ulp_u;
rank[ulp_u]++;
}
}
void unionBySize(int u, int v) {
int ulp_u = findUPar(u);
int ulp_v = findUPar(v);
if(ulp_u == ulp_v) return;
if(size[ulp_u] < size[ulp_v]) {
parent[ulp_u] = ulp_v;
size[ulp_v] += size[ulp_u];
}
else {
parent[ulp_v] = ulp_u;
size[ulp_u] += size[ulp_v];
}
}
};
class Solution {
public:
bool check_val(int x, int y, int n){
return x>=0 and y>=0 and x<n and y<n;
}
int largestIsland(vector<vector<int>>& grid) {
int n = grid.size();
DisjointSet ds(n*n);
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
for(int row=0; row<n; row++){
for(int col=0; col<n; col++){
if(grid[row][col] == 0) continue;
for(int i=0; i<4; i++){
int nrow = row + dx[i];
int ncol = col + dy[i];
if(check_val(nrow, ncol, n) and grid[nrow][ncol] == 1){
int node = row*n+col;
int adj_node = nrow*n + ncol;
ds.unionBySize(node, adj_node);
}
}
}
}
int maxi = 0;
for(int row=0; row<n; row++){
for(int col=0; col<n; col++){
if(grid[row][col] == 1) continue;
set<int> components;
for(int i=0; i<4; i++){
int nrow = row + dx[i];
int ncol = col + dy[i];
if(check_val(nrow, ncol, n) and grid[nrow][ncol] == 1){
int node = nrow * n+ ncol;
components.insert(ds.findUPar(node));
}
}
int temp_sum=0;
for(auto &it: components){
temp_sum += ds.size[it];
}
maxi = max(maxi, temp_sum + 1);
}
}
for(int i=0; i<n*n; i++){
maxi = max(maxi, ds.size[ds.findUPar(i)]);
}
return maxi;
}
};