并查集
首先并查集有俩个操作:
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; }