并查集是优雅简单的数据结构,主要用于一些元素分组的问题,管理集合,管理联通性。支持查找和合并。
void init(int n){//初始化
fer(i,1,n+1){
fa[i]=i;//父节点指向它自己
rank[i]=1;//深度
}
}
int find1(int x){//查找,不带路径压缩
if(fa[x]==x)return x;
return find1(fa[x]);
}
int find2(int x){//查找,带路径压缩
return x==fa[x]?x:(fa[x]=find2(fa[x]));
}
void merge(int i,int j){//合并,按秩合并
int x=find(i),y=find(j);
if(rank[x]<=rank[y])fa[x]=y;
else fa[y]=x;
if(rank[x]==rank[y]&&x!=y)rank[y]++;
}
const int N=2e4+7,mod=1e9+7;
int fa[N],n,q,a,b;
void init(int n){
fer(i,1,n+1){
fa[i]=i;
}
}
int find(int x){
return x==fa[x]?x:(fa[x]=find(fa[x]));
}
signed main(){
cin>>n;
init(N);
while(n--){
cin>>a>>b;
fa[b]=a;//b是a的附庸
}
cin>>q;
while(q--){
cin>>a>>b;
if(find(a)==find(b))cout<<1<<endl;
else cout<<0<<endl;
}
return 0;
}
const int N=1e5+7,mod=1e9+7;
int fa[N],t[N],n,m;
void init(int n){
fer(i,1,n+1){
fa[i]=i;
}
}
int find(int x){
return x==fa[x]?x:(fa[x]=find(fa[x]));
}
void merge(int i,int j){
int x=find(i),y=find(j);
if(x!=y){
fa[x]=y;//y作为根节点
t[y]+=t[x];//更新根节点的蜂蜜值
}
}
signed main(){
cin>>n>>m;
int tmp;
fer(i,1,n+1){
cin>>tmp;
t[i]=tmp;
}
init(n);
int op,a,b;
while(m--){
cin>>op;
if(op==1){
cin>>a>>b;
merge(a,b);
}else{
cin>>a;
cout<<t[find(a)]<<endl;
}
}
return 0;
}
const int N=1e5+7,mod=1e9+7;
int fa[N],t[N],n,m;
void init(int n){
fer(i,1,n+1){
fa[i]=i;
t[i]=1;
}
}
int find(int x){
return x==fa[x]?x:(fa[x]=find(fa[x]));
}
void merge(int i,int j){
int x=find(i),y=find(j);
if(x!=y){
fa[x]=y;//y作为根节点
t[y]+=t[x];
}
}
signed main(){
cin>>n>>m;
init(n);
int a,b;
while(m--){
cin>>a>>b;
merge(a,b);
}
int x;cin>>x;
cout<<t[find(x)]<<endl;
return 0;
}