并查集模板1(常用)
- int findset(int x)//查
- {
- if(x != father[x])
- father[x]=findset(father[x]);//查的过程中进行路径压缩,有效加快并查集运算
- return father[x];
- }
- int unionset(int a, int b)//并
- {
- int x=findset(a);
- int y=findset(b);
-
- if(x != y) //不在同一根上,进行合并操作
-
- father[y]=x;
- return 0;
- }
并查集模板2
- int parent[Max]; //记录结点的双亲
-
- int rank[Max]; //记录结点的深度
- void init(int n) //初始化
- {
- int i;
- for(i=0;i<=n;i++)
- {
- parent[i]=i;
- rank[i]=1;
- }
- }
- int find(int x) //查找
- {
- int t=x, temp;
- while(parent[x]!=x) //找所属集合,即根结点
- x=parent[x]; //x为最终找到的根节点
- while(parent[t]!=x)
- {
- //路径压缩,使深度不为1的点向上浮。
- temp=parent[t];
- parent[t]=x;
- rank[t]=1;
- t=temp;
- }
- return x;
-
- //x为最终找到的根节点
-
- }
-
- void merge(int x,int y) //合并
- {
- int tx=find(x);
- int ty=find(y);
- if(tx!=ty) //路径压缩 ,合并操作,离根距离更远的节点,向近的合并靠拢
- {
- if (rank[tx]<rank[ty])
- {
- parent[ty]=tx;
- rank[ty]+=rank[tx];
- rank[tx]=1;
- }
- else
- {
- parent[tx]=ty;
- rank[tx]+=rank[ty];
- rank[ty]=1;
- }
- }
- }