并查集
你要写成类就写成这样
//使用了swap()函数 , 因此要包含头文件
// #include<utility>
struct DjSet{
vector<int> fa;
vector<int> rank;
int n;
int setCount;
DjSet(int n)
{
this->n=n;
setCount=n;
rank.resize(n,1);
fa.resize(n);
for(int i=0;i<n;i++)
fa[i]=i;
}
int find(int x)
{
if(fa[x]!=x)
fa[x]=find(fa[x]);
return fa[x];
}
void Union(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx==fy)
return ;
if(rank[fx]<rank[fy])
swap(fx,fy);
rank[fx]+=rank[fy];
fa[fy]=fx;
setCount--;
}
};
或者不封装成一个类,写成这样
vector<int> fa;
vector<int> rank;
int n;
int setCnt;
int find(int x){
if(fa[x] != x)
return find(fa[x]);
return x;
}
void Union(int x,int y){
int fx = find(x),fy = find(y);
if(fx == fy)
return ;
if(rank[fx] > rank[fy])
swap(fx,fy);
fa[fy] = fx;
rank[fx] += rank[fy];
setCnt --;
}
时间复杂度分析日后补充