Fastrail08

LC 827 Making a Large Island (DSU)

Aug 31st, 2025
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.13 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int dx[4] = {-1, 0, 1, 0};
  5. const int dy[4] = {0, 1, 0, -1};
  6.  
  7. bool isValid(int r, int c, int n){
  8.     if(r < 0 || r >= n || c < 0 || c >= n){
  9.         return false;
  10.     }
  11.     return true;
  12. }
  13.  
  14. class DS{
  15.     public:
  16.     map<pair<int, int>, pair<int, int> > parent;
  17.     map<pair<int, int>, int> size;
  18.    
  19.     DS(){}
  20.    
  21.    
  22.     pair<int, int> find(int r, int c){
  23.         pair<int, int> cell = make_pair(r, c);
  24.         if(cell == parent[cell]){
  25.             return cell;
  26.         }
  27.         pair<int, int> pCell = parent[cell];
  28.         return parent[cell] = find(pCell.first, pCell.second);
  29.     }
  30.    
  31.     void Union(int u1, int v1, int u2, int v2){
  32.         pair<int, int> a = find(u1, v1), b = find(u2, v2);
  33.         if(a != b){
  34.             if(size[a] >= size[b]){
  35.                 parent[b] = a;
  36.                 size[a] += size[b];
  37.             }
  38.             else{
  39.                 parent[a] = b;
  40.                 size[b] += size[a];
  41.             }
  42.         }
  43.     }
  44. };
  45.  
  46.  
  47. int largestIsland(vector<vector<int> > &grid){
  48.     DS dsu;
  49.    
  50.     //Init parent and size property of DSU for cell value already 1
  51.     for(int i = 0; i < grid.size(); i++){
  52.         for(int j = 0; j < grid.size(); j++){
  53.             if(grid[i][j] == 1){
  54.                 pair<int, int> cell = make_pair(i, j);
  55.                 dsu.parent[cell] = cell;
  56.                 dsu.size[cell] = 1;
  57.             }
  58.         }
  59.     }
  60.    
  61.     // Update DSU
  62.     for(int i = 0; i < grid.size(); i++){
  63.         for(int j = 0; j < grid.size(); j++){
  64.             if(grid[i][j] == 1){
  65.                 set<pair<int, int> > s;
  66.                 for(int k = 0; k < 4; k++){
  67.                     int ni = i + dx[k], nj = j + dy[k];
  68.                     if(isValid(ni, nj, grid.size())){
  69.                         //optonal to only merge cell with unique ultimate parents
  70.                         //As merging with different cells with same ultimate parent will not have any affect on they are merged.
  71.                         // Reducing the size of number of components based on a new connection - there we have to state this condition
  72.                         //Only reduce the number of distinct components when merged with cells that have distinct ultimate parents.
  73.                         if(grid[ni][nj] == 1){
  74.                             pair<int, int> pNewCell = dsu.find(ni, nj);
  75.                             if(s.count(pNewCell) == 0){
  76.                                 dsu.Union(i, j, ni, nj);
  77.                                 s.insert(pNewCell);
  78.                             }
  79.                         }
  80.                     }
  81.                 }
  82.             }
  83.         }
  84.     }
  85.    
  86.     // //NOT NECCESSARY TO DO A GLOBAL SWEEP
  87.     //1) Ultimate parents always have the correct size immediately after unions.
  88.     //2) DSU invariant: root has the true size, non-roots are irrelevant.
  89.     //Global Sweep to FULLY FLATTEN DSU / PATH COMPRESSED FULLY
  90.     // Doing so, will guarantee that each node in DSU will DIRECTLY point to it's ultimate parent
  91.     for(int i = 0; i < grid.size(); i++){
  92.         for(int j = 0; j < grid.size(); j++){
  93.             if(grid[i][j] == 1){
  94.                 pair<int, int> p = dsu.find(i, j);
  95.             }
  96.         }
  97.     }
  98.    
  99.    
  100.    
  101.     int maxSize = 0;
  102.     // For each 0 in grid, see what is the size of new connected component
  103.     for(int i = 0; i < grid.size(); i++){
  104.         for(int j = 0; j < grid.size(); j++){
  105.             if(grid[i][j] == 0){
  106.                 set<pair<int, int> > s;
  107.                 int currentSize = 0;
  108.                 for(int k = 0; k < 4; k++){
  109.                     int ni = i + dx[k], nj = j + dy[k];
  110.                     if(isValid(ni, nj, grid.size())){
  111.                         if(grid[ni][nj] == 1){
  112.                             pair<int, int> upNewCell = dsu.find(ni, nj);
  113.                             if(s.count(upNewCell) == 0){
  114.                                 currentSize += dsu.size[upNewCell];
  115.                                 s.insert(upNewCell);
  116.                             }
  117.                         }
  118.                     }
  119.                 }
  120.                 //Add the current cell (if converted to 1) to the whole size
  121.                 maxSize = max(maxSize, 1 + currentSize);
  122.             }
  123.             else{
  124.                 pair<int, int> pCell = dsu.find(i, j);
  125.                 //don't add 1, because the cell is already 1
  126.                 maxSize = max(maxSize, dsu.size[pCell]);
  127.             }
  128.         }
  129.     }
  130.     // for(auto p : dsu.parent){
  131.     //     pair<int, int> parP = p.second;
  132.     //     cout << "[" << p.first.first << " " << p.first.second << "] [" << parP.first << " " << parP.second << "]" << '\n';
  133.     // }
  134.    
  135.    
  136.     // for(auto p : dsu.size){
  137.     //     cout << "[" << p.first.first << " " << p.first.second << "] = " << p.second << '\n';
  138.     // }
  139.     return maxSize;
  140. }
  141.  
  142. int main() {
  143.     // your code goes here
  144.     int n;
  145.     cin >> n;
  146.     vector<vector<int> > grid(n, vector<int>(n, 0));
  147.     for(int i = 0; i < n; i++){
  148.         for(int j = 0; j < n; j++){
  149.             cin >> grid[i][j];
  150.         }
  151.     }
  152.     cout << largestIsland(grid) << '\n';
  153. }
  154.  
Advertisement
Add Comment
Please, Sign In to add comment