并查集框架参考
普通版
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int n=M.size();
count=n;
parent.resize(n,0);
for(int i=0; i<n; i++)
parent[i] = i;
for(int i=0; i<n-1;i++){
for(int j=i+1; j<n; j++){
if(M[i][j]==1){
union_(i,j);
}
}
}
return count;
}
private:
vector<int> parent;
int count;
void union_(int p, int q){
int rootP = find(p);
int rootQ = find(q);
if(rootP == rootQ) return;
parent[rootP] = rootQ;
count--;
}
int find(int x){
while(x!=parent[x]){
x = parent[x];
}
return x;
}
};
优化版
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int n=M.size();
count=n;
parent.resize(n,0);
size.resize(n,1);
for(int i=0; i<n; i++)
parent[i] = i;
for(int i=0; i<n-1;i++){
for(int j=i+1; j<n; j++){
if(M[i][j]==1){
union_(i,j);
}
}
}
return count;
}
private:
vector<int> parent;
int count;
vector<int> size;
void union_(int p, int q){
int rootP = find(p);
int rootQ = find(q);
if(rootP == rootQ) return;
if(size[rootP]>size[rootQ]){
parent[rootQ] = rootP;
size[rootP] += size[rootQ];
}else{
parent[rootP] = rootQ;
size[rootQ] += size[rootP];
}
count--;
}
int find(int x){
while(x!=parent[x]){
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
};
框架
class UnionFind{
private:
int count;
vector<int> parent;
vector<int> size;
public:
UnionFind(int n){
count=n;
parent.resize(n,0);
size.resize(n,0);
for(int i=0; i<n; i++){
parent[i] = i;
size[i]=1;
}
}
void union_(int p, int q){
int rootP = find(p);
int rootQ = find(q);
if(rootP == rootQ) return;
if(size[rootP] > size[rootQ]){
parent[rootQ] = rootP;
size[rootP] += size[rootQ];
}else{
parent[rootP] = rootQ;
size[rootQ] += size[rootP];
}
count--;
}
bool connected(int p, int q){
int rootP = find(p);
int rootQ = find(q);
return rootP == rootQ;
}
int find(int x){
while(parent[x]!=x){
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
int num(){
return count;
}
};