f[x]为结点x的父节点
f[ ] 初始化:每个节点是一个集合,每个节点的父节点是它自己
for(int i=1;i<=n;i++) f[ ]=i;
查找:确定某个元素处在哪个集合。
根节点是集合的代表查找就是找到元素所在集合的根
1.如果父节点等于自己,则找到了根并返回
2.如果还没找到根,则继续递归查找
int find(int x){//压缩路径 if(f[x]!=x) f[x]=find(f[x]); return f[x]; }
合并:把一个集合的根指向另一个集合的根。
f[find(a)]=find(b);//合并,a的根节点的父亲等于b的父亲
#include<stdio.h>
using namespace std;
const int N=100050;
int f[N];
int n,m;//n个元素,m个操作
int find(int x){//压缩路径
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) f[i]=i;//并查集的初始化
while(m--){
int op;
int a,b;
scanf("%d %d %d",&op,&a,&b);
//根节点指向另一个根节点
if(op==1) f[find(a)]=find(b);//合并,a的根节点的父亲等于b的父亲
else{
if(find(a)==find(b)) printf("Y\n");//判定两个人的根节点是否相等
else printf("N\n");
}
}
return 0;
}
#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int p[N], cnt[N];
int find(int x)//路径压缩
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ )
{
p[i] = i;
cnt[i] = 1;
}
while (m -- )
{
string op;
int a, b;
cin >> op;
if (op == "C")
{
cin >> a >> b;
a = find(a), b = find(b);
if (a != b)
{
p[a] = b;
cnt[b] += cnt[a];
}
}
else if (op == "Q1")
{
cin >> a >> b;
if (find(a) == find(b)) puts("Yes");
else puts("No");
}
else
{
cin >> a;
cout << cnt[find(a)] << endl;
}
}
return 0;
}
合根植物
![]()
//输入 5 4 16 2 3 1 5 5 9 4 8 7 8 9 10 10 11 11 12 10 14 12 16 14 18 17 18 15 19 19 20 9 13 13 17
//输出 5
#include<bits/stdc++.h>
using namespace std;
int m,n,k,a,b,sz[1000000],sum=0;
int find(int x){
if(sz[x]!=x) sz[x]=find(sz[x]);
return sz[x];
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=m*n;i++){
sz[i]=i;//初始化,自己一个也要计入sum
}
for(int i=1;i<=k;i++){
cin>>a>>b;
int s1=find(a),s2=find(b);
sz[s1]=s2;//sz[find(a)]=find(b);
}
for(int i=1;i<=m*n;i++){
if(sz[i]==i){
sum++;
}
}
cout<<sum;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,m,p,f[100050];//n 个人,m 个亲戚关系,询问p 对亲戚关系。
int find(int x){//找祖先结点
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
void hb(int a,int b){
f[find(a)]=find(b);
}
int main() {
scanf("%d %d %d",&n,&m,&p);
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++) {
int c,d;
scanf("%d %d",&c,&d);
hb(c,d);
}
for(int i=1;i<=p;i++) {
int c,d;
scanf("%d %d",&c,&d);
if(find(c)==find(d)) printf("Yes\n");
else printf("No\n");
}
return 0;
}