首页 > 其他分享 >并查集

并查集

时间:2024-01-27 13:45:53浏览次数:31  
标签:fa int fy 查集 fx 集合 find

简介

并查集是一种维护集合的数据结构。

支持合并和查询元素所在集合。

我们将所有元素用点表示,从属关系用边表示,那么每个集合构成了一棵有向树。每个点有且仅有一条出边,指向其父亲。其中根节点的出边指向自己。集合用根节点的编号代表。

实现

初始化

一开始所有的元素指向自己。

int fa[MAXN];
void init(){
	for(int i=1;i<=n;i++)
		fa[i]=i;
}

查询

查找元素所属的集合就是从该元素开始不断跳父亲,直到根节点。

int find(int x){
	return x==fa[x]?x:find(fa[x]);
}

合并

如果要合并 \(x\) 所属集合和 \(y\) 所属的集合,直接将 \(x\) 所属集合的根指向 \(y\) 所属集合的根。

void merge(int x,int y){
	int fx=find(x),fy=find(y);
	fa[fx]=fy;
}

注意到其实不用考虑 \(fx\) 和 \(fy\) 的值是否相同,因为就算相同,根节点的父亲也就是自己。

路径压缩

如果 \(x\) 属于集合 \(u\),那么查询完后,我们可以直接将所有查询到的节点直接连到根 \(u\) 上。

int find(int x){
	return x==fa[x]?x:fa[x]=find(fa[x]);
}

启发式合并

合并时将较小的集合合并到较大的集合上,这样每次 find 时复杂度就会较低。

void merge(int x,int y){
	int fx=find(x),fy=find(y);
	if(sz[fx]>sz[fy]){
		fa[fy]=fx;
		sz[fx]+=sz[fy];
	}else{
		fa[fx]=fy;
		sz[fy]+=sz[fx];
	}
}

连通性

并查集支持加边维护连通性,每次加边就将两个点所在的联通块集合合并集合。

标签:fa,int,fy,查集,fx,集合,find
From: https://www.cnblogs.com/CheZiHe929/p/17991347

相关文章

  • 【模板】并查集
    并查集是解决两元素是否属于同一集合,将一个集合合并另一集合的数据结构。具体来说,我们使用数字代替集合,比如集合1,集合2.使用数组f[i]维护元素i属于的集合,比如f[2]=4表示元素2属于集合4。具体我们有以下实现功能的代码1初始化表示集合的数组。cin>>n>>m;for(int......
  • Codeforces Round 170 (Div. 1)A. Learning Languages并查集
    如果两个人会的语言中有共同语言那么他们之间就可以交流,并且如果a和b可以交流,b和c可以交流,那么a和c也可以交流,具有传递性,就容易联想到并查集,我们将人和语言看成元素,一个人会几种语言的话,就将这些语言和这个人所在的集合合并,最后求一下人一共在几个连通块中,连通块的个数-1就是答案,......
  • P1536 村村通(并查集)
    村村通题目描述某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府"村村通工程"的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?输入格式输入包含若干......
  • CF-1184-E3-最小生成树+倍增+并查集
    1184-E3题目大意给定一个\(n\)个点,\(m\)条边的无向图,边带权。对于每条边,你需要找到最大值\(x\),使得把这条边的权值修改为\(x\)后能够出现在最小生成树上。Solution先把整个图的最小生成树弄出来,然后将边分为树边以及非树边来考虑:非树边:对于一个非树边连接了\(x\)和\(y\)的......
  • 并查集与反集——P1892团伙
    并查集并查集如其名,合并与查找查找intfind(intkey){ if(fa[key]==key)returnkey; elsereturnfa[key]=find(fa[key]);}合并voidunite(intx,inty){ intfax=find(x); intfay=find(y); fa[fax]=fay; return;}反集处理并查集合并问题的敌对/......
  • 并查集
    并查集是一种集合结构,用来处理集合的合并和查询问题。主要有两个函数:合并和查询合并函数表示合并两个不同的集合查询表示当前元素属于那个集合逻辑结构是单链表的结构,每个节点向上指向一个属于的集合的代表元素,这个集合的代表元素的next指向它自己成环,表示这个集合的代表元素......
  • CF-292-D-并查集
    292-D题目大意给定一张无向图,由\(n\)个顶点\(m\)条边。有\(q\)次询问,每次询问将\([l,r]\)的边删去,问图中有多少连通分量。Solution涉及连通分量,尝试应用并查集解决。记录一个前缀并查集\(pre[i]\),表示前\(i\)条边连通后的图;和一个后缀并查集\(suf[i]\),表示后\(m-i\)条边连通......
  • CF-915-F-并查集
    915-F题目大意给定一棵\(n\)个节点的树,节点带权,设函数\(I(x,y)\)等于点\(x\)到点\(y\)的路径上最大的点权与最小的点权之差。求:\[\sum_{i=1}^{n}\sum_{j=i}^{n}I(i,j)\]Solution令函数\(F(i,j)\)等于点\(x\)到点\(y\)的路径上最大的点权,函数\(G(i,j)\)等于点\(x\)到点\(y\)......
  • 并查集综合
    种类并查集关押罪犯经典种类并查集。考虑要想使最后的结果尽可能小,必须按照怨气值大小将每组关系排序,从大到小依次将罪犯放入监狱。对于放的过程,用并查集维护。由于我们已经将怨气值大小排序,所以对于一组\(a\)与\(b\)的矛盾,将\(a\)与\(b\)不放在同一个监狱一定是最优......
  • 并查集
    并查集基础并查集(\(\sfDisjoint\Set\Union\),\(\sfDSU\))是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。初始化:初始化时每个节点均为一个集合,因此根节点初始化为自己。for(inti=1;i<=n;i++)fa[i]......