C01【模板】并查集
C01【模板】并查集——信息学奥赛算法_哔哩哔哩_bilibili
并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素.
顾名思义,并查集支持两种操作:
- 合并(Unite):合并两个元素所属集合(合并对应的树).
- 查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合.
并查集可以维护点的连通性.
P3367 【模板】并查集 - 洛谷
//并查集 路径压缩 #include<bits/stdc++.h> using namespace std; const int N=200005; int n,m; int fa[N]; int find(int x){ return fa[x]==x?x:(fa[x]=find(fa[x])); } void unite(int x,int y){ fa[find(x)]=find(y); } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) fa[i]=i; for(int x,y,z;m--;){ cin>>z>>x>>y; if(z==1) unite(x,y); else{ if(find(x)==find(y)) puts("Y"); else puts("N"); } } }
//并查集 路径压缩+按秩合并 #include<bits/stdc++.h> using namespace std; const int N=200005; int n,m; int fa[N],siz[N]; //子树大小 int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } void unite(int x,int y){ x=find(x),y=find(y); if(x==y)return; if(siz[x]<siz[y]) swap(x,y); fa[y]=x; siz[x]+=siz[y]; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1; for(int x,y,z;m--;){ cin>>z>>x>>y; if(z==1) unite(x,y); else{ if(find(x)==find(y))puts("Y"); else puts("N"); } } }
P1551 亲戚 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P2078 朋友 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P2814 家谱 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1536 村村通 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1111 修复公路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1195 口袋的天空 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1455 搭配购买 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1396 营救 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1991 无线通讯网 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P4047 [JSOI2010] 部落划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1967 [NOIP2013 提高组] 货车运输 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
浙公网安备 33010602011771号