void connect(int a, int b) { if (a < 1 || a >= mParentId.size() || b < 1 || b >= mParentId.size()){ return;//error } auto aId = UnionFind(a); auto bId = UnionFind(b); if(aId != bId) { mParentId[aId].first = bId; mParentId[bId].second += mParentId[aId].second; } }
int query(int a) { if (a < 1 || a >= mParentId.size()){ return -1;//error } auto aId = UnionFind(a); return mParentId[aId].second; }
vector<Edge> kruskal(int V, vector<Edge>& edges){ auto union_find = UnionFind(V); sort(edges.begin(), edges.end()); vector<Edge> res; for(auto& edge: edges){ if(union_find.unite(edge.from, edge.to)){ res.push_back(edge); } } return res; }
vector<int> numIslands2(int m, int n, vector<pair<int, int>>& positions) { if(positions.empty()) return vector<int>(); UnionFind uf = UnionFind(); vector<int> res; for(int i = 0; i < positions.size(); ++i){ int x = positions[i].first; int y = positions[i].second; int idx = x*n+y; uf.add(idx); if(x+1<m) uf.unionF(idx, (x+1)*n+y); if(x>0) uf.unionF(idx, (x-1)*n+y); if(y+1<n) uf.unionF(idx, x*n+y+1); if(y>0) uf.unionF(idx, x*n+y-1); res.push_back(uf.getCnt()); } return res; }