并查集
主要用于处理不相交集合问题,一些常见的用途有连通子图,最小生成树的Kruskal算法和最近公共祖先(lca)等。
主要操作:
1.初始化
init (把每个数的祖先初始化为自己)
2,查找
find (找到i的祖先,递归出口是祖先是否是自己)
3,合并
unionn (合并i,i,让i的祖先指向j的祖先)
int fa[max];
void init(int n){
for (int i=1;i<=n;i++){
fa[i]=i;
}
}
int find(int i){
if (fa[i]==i)return i;
else return find(fa[i]);
}
void unionn(int i,int j){
int i_fa=find(i);
int j_fa=find(j);
fa[i_fa]=j_fa;
}