数据结构:速通并查集

并查集用来干什么:处理不相交的集合的合并以及查询相交集合的个数等情况

例题(自行搜索):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中
}

 

posted @ 2024-09-27 20:46  天启A  阅读(12)  评论(0)    收藏  举报