关于并查集
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint
sets)的合并及查询问题。 ——《百度百科》
在并查集中主要有两个操作:合并和查找,其中查找需要用递归实现。
模板题
模板题:Luogu P3367
【模板】并查集
参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; int p[10005]; inline int read() { char ch=getchar(); int s=0,w=1; while(ch<'0'||ch>'9'){if(ch=='-') w=-1; ch=getchar();} while(ch>='0'&&ch<='9'){s=s*10+(ch-'0'); ch=getchar();} return s*w; } inline int find(int x){ if(x==p[x]) return x; return p[x]=find(p[x]); } int main() { int n,m; n=read(),m=read(); for(int i=0;i<=n;i++) p[i]=i; while(m--){ int x,y,z; z=read(),x=read(),y=read(); int tx=find(x),ty=find(y); if(z==1){ if(tx!=ty) p[tx]=ty; } if(z==2){ tx==ty ? printf("Y\n") : printf("N\n"); } } return 0; }
|
例题
洛谷P1551 亲戚
这也是一道很经典的例题,其实这种入门题核心思路基本一样,参考代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; int p[100005]; int f(int x) { if(p[x]==x) return x; return p[x]=f(p[x]); } int main() { int n,m,z; scanf("%d%d%d",&n,&m,&z); for(int i=1; i<=n; i++) p[i]=i; while(m--) { int a,b; scanf("%d%d",&a,&b); int tx=f(a),ty=f(b); if(tx==ty) continue; p[tx]=ty; } while(z--) { int a,b; scanf("%d%d",&a,&b); int tx=f(a),ty=f(b); if(tx==ty) printf("Yes\n"); else printf("No\n"); } return 0; }
|