标签:count parent int 查集 子集 UnionFind 模板
并查集的作用就是把一个数据集分成若干个子集,每个子集内部数据可以互联互通,而子集之间则不具有连通性。
并查集的底层结构类似于堆,也是用数组描述一种树结构,但不同的是,堆是一棵独立的二叉树,并查集的树是多叉树,而且可能不止一棵树(也就是森林)。
在并查集中,我们把相互独立的数据集称为连通分量,连通分量在逻辑上可以形象地描述为一棵树,每棵树都有一个根节点,其他的元素都会直接或间接指向根节点。
class UnionFind {
private:
int count;
vector<int> parent;
public:
UnionFind(int n) : parent(n) {
count=n;
for (int i=0;i<n;i++) {
parent[i]=i;
}
}
/* 查找根节点 */
int findRoot(int x) {
if (x!=parent[x]) {
parent[x]=findRoot(parent[x]);
}
return parent[x];
}
/* 合并操作 */
void unionRoot(int x, int y) {
int root_x=findRoot(x);
int root_y=findRoot(y);
if (root_x != root_y) {
parent[root_x]=root_y;
count--;
}
}
/* 判断x,y是否属于同一连通分量 */
bool isConnect(int x, int y) {
return findRoot(x)==findRoot(y);
}
/* 返回连通分量个数 */
int getCount() {
return count;
}
};
标签:count,parent,int,查集,子集,UnionFind,模板 来源: https://www.cnblogs.com/hunter-w/p/15045000.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。