并查集模板:
//并查集模板
static int id[]=new int [1000010];
//创建祖先数组,并将每个元素的祖先设置为自己
static void creat(){
for(int i=0;i<id.length;i++){
id[i]=i;
}
}
static int count=0;
//查寻各自的祖先
static int find(int i){
if (id[i]==i){
return i;
}
id[i]=find(id[i]);//???
return id[i];
}
//集(合并操作)
static void union(int i,int j){
int a=find(i);
int b=find(j);
if (a!=b){//避免重复和并
id[a]=b;
count++;//合并次数
}
}
并查集的模板实现,用于解决集合的合并与查找问题。以下是代码的详细解释:
id[]
: 这是一个数组,用于存储每个元素的祖先(也可以理解为代表元素),数组的索引表示元素的编号,数组的值表示该元素的祖先的编号。creat()
: 这个方法用于初始化并查集,将每个元素的祖先设置为自己,即id[i] = i
。find(int i)
: 这个方法用于查找元素i
的祖先。如果id[i] == i
,表示i
自己就是祖先,直接返回i
;否则,递归地查找id[i]
的祖先,并将i
的祖先设置为查找结果,这是为了路径压缩,优化后续的查找操作。union(int i, int j)
: 这个方法用于合并两个集合。首先找到i
和j
的祖先a
和b
,如果a != b
,说明它们属于不同的集合,将其中一个集合的祖先指向另一个集合的祖先,这样就完成了合并操作。同时,维护一个计数器count
,记录合并操作的次数。
并查集通常用于解决元素之间的连通性问题,比如在图论中判断两个节点是否在同一个连通分量中,或者在最小生成树算法中判断是否形成环等。