并查集用来干什么:处理不相交的集合的合并以及查询相交集合的个数等情况
例题(自行搜索):360 24年第一批笔试算法题传染病防控
并查集具有三个操作init find union
init
初始化集合,将当前所有节点的父节点设置为自己
int fa[]=new int[10000]; int size[]=new int[10000];//这里是为了记录当前节点有多少子节点,假设自己也算子节点 void init(int n){ for(int i=0;i<n;i++){ fa[n]=i;size[i]=1;
} }
find
找到该节点的父节点
int find(int n){ if(fa[n]==n){//说明当前节点的父节点就是自己 return n; } else{ fa[n]=find(fa[n]);//递归找到当前节点的最大父节点 return fa[n]; } }
union
将节点合在一起,让他们形成一个集合,由fa[n]表示当前节点的父节点是谁
void union(int x,int y){ int fa_x=find(x); int fa_y=find(y); if(fa_x==fa_y)//说明他们本来就是一个父节点,不需要处理 return; fa[x]=y;//他们是两个集合,那么这里就需要将他们并在一起。这里取y作为父节点
size[y]+=size[x];//x已经成为了y的子节点,那么x的所有子节点也应该加入到y中
}
标签:速通,int,查集,find,fa,集合,数据结构,节点 From: https://www.cnblogs.com/kun1790051360/p/18436515