并查集模板 (洛谷p3367题解)

 

 

#include<bits/stdc++.h>
using namespace std;
const int maxn = 10005;
int s[maxn];
void init(){ // 初始化使初始的每个结点都是自己的根结点
for(int i = 1 ; i <= maxn ; i++){
s[i]=i;
}
}
int find_set(int x){ // 找到每个元素的根结点,并且压缩路径使得每个元素直接接在根节点上
return x==s[x]?x:s[x]=find_set(s[x]);
}
void union_set(int x, int y){//将两个根结点不同的根结点连起来
x = find_set(x);
y = find_set(y);
if(x!=y) s[x]=s[y];
}
int main()
{
int n , m ;
int x , y , z;
init();
int ans=0;
scanf("%d %d",&n,&m);
while(m--){
scanf("%d %d %d",&z,&x,&y);
if(z==1)
union_set(x,y);
else{
x=find_set(x);
y=find_set(y);
if(x==y)
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}

//全套并查集
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1050;
int s[maxn + 1];
//初始化
void init_set(){
for(int i = 1 ; i <=maxn ; i++){
s[i]=i;
}
}
//查找
int find_set(int x, int y){
return x == s[x] ? x:find_set(s[x]);
}
//合并
void union_set(int x, int y){
x = find_set(x);
y = find_set(y);
if(x != y) s[x] = s[y];
}
int main()
{
int t,m, x, y;
cin>>t;
while(t--){
cin>>n>>m;
init_set()
for(int i = 1 ; i < = m ; i++){
cin>>x>>y;
union_set(x,y);
}
int ans = 0 ;
//统计有多少个集
for(int i = 1 ; i<= n ; i++)
if(s[i]==i)
ans++;
cout<<ans<<endl;
}
return 0;
}
//合并的优化
/*
int height[maxn + 1];
void init_set{
for(int i = 1 ;i <= maxn ; i++){
s[i] = i;
height[i] = 0;
}
}
void union_set(int x, int y){
x = find_set(x);
y = find_set(y);
if(height[x] == height[y]){
height[x] = height[y] + 1;
s[y] = x;
}
else{
if(height[x] < height[y]) s[x] =y;
else s[y] =x;
}
}
*/
//路径压缩(递归)
/*
int find_set(int x){
if(!= s[x]) s[x] = find_set(s[x]); //路径压缩
return s[x];
}
*/
//路径压缩(非递归)
/*
int find_set(int x){
int r = x;
while(s[r] != r) r = s[r]; //找到根节点
int i = x , j;
while(i != r){
j =s[i];
s[i] = r;
i = j;
}
return 0;
}
*/

posted @   ganl啦  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示