并查集(含有路径压缩)

Posted 最爱小崔同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集(含有路径压缩)相关的知识,希望对你有一定的参考价值。

//并查集
#include<iostream>
using namespace std;
const int N=100010;
int n,m;
int p[N];
int find(int x)//返回x的祖宗节点+路径压缩 
{
    //最核心操作; 
    if(p[x]!=x) p[x]=find(p[x]);//让x的父亲节点等于x的祖宗节点 
    return p[x];
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)  p[i]=i;//没合并之前自己就是自己的祖宗
    while(m--)
    {
        char op[2];
        int a,b;
        scanf("%s%d%d",op,&a,&b);
        if(op[0]=='M')  p[find(a)]=find(b);//合并操作;让a节点祖宗的父亲等于b的祖宗节点
        else 
        {
            if(find(a)==find(b)) puts("YES");
            else puts("NO");    
        } 
    } 
    return 0;    

以上是关于并查集(含有路径压缩)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1988 Cube Stacking(并查集+路径压缩)

(转)并查集路径压缩

并查集压缩路径

并查集 路径压缩

并查集+路径压缩

并查集的非递归路径压缩