并查集

首先并查集有俩个操作:

1.合并两个集合

2.查找2个元素是否属于一个集合。

 

我们这里可以用树来存集合。

我们定义p[x]=x是根节点

然后每个p[x]存的是父节点的编号。

如何求元素对应集合的编号呢  if(p[x]!=x) x=p[x];

怎么合并两个集合p[x],p[y]呢  我们就令   p[x]=y;

这里给出一道最基础的并查集的题目

https://www.acwing.com/problem/content/838/

#include<iostream>

using namespace std;

const int N = 100010;
int p[N];
int n,m;

int find(int x)//找到根节点,如果没找到根节点,令p[x]=根节点,就是路径压缩;
{
    if(p[x]!=x) p[x]=find(p[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=='M') p[find(a)]=find(b);//让a的根节点指向b的集合编号,即将a合并到b上
        else
        {
            if(find(a)==find(b)) puts("Yes");
            else puts("No");
        }
    }
    return 0;
 } 

 

posted @ 2020-02-13 21:30  zust-lms  阅读(135)  评论(0编辑  收藏  举报