并查集(union-find disjoint sets)板子

并查集核心代码

//find 函数
int pre[x] // 维护祖宗节点;
int d[x]// x 到pre[x]的权值;
int find(int x){
    
    
	return x == pre[x]?:x:pre[x] == find(pre[x]);
}
//带权并查集find函数
int find(int x){
    
    
	if(x != pre[x]){
    
    
		int u = find(pre[x]);
		d[x] += d[p[x]]; //d[x]的初始化根据题意,经典例题:食物链;
		p[x] = u; 
	}
}

// 初始化,假定节点编号是1~n
   for (int i = 1; i <= n; i ++ ) pre[i] = i // 维护size: size[i] = 1;
// 合并a和b所在的两个集合:
   pre[find(a)] = find(b);

//维护集合内元素个数 size[x];  // x 为祖宗结点;
	size[find(b)] += size[find(a)];
	pre[find(a)] = find(b);
	


猜你喜欢

转载自blog.csdn.net/qq_51687628/article/details/119839757