AcWing 836. 合并集合(含注释)
原题链接
简单
作者:
现代修士o_O
,
2021-04-24 09:55:30
,
所有人可见
,
阅读 285
//并查集:1.将两个集合合并
// 2.查询两个元素是否在同一集合
//基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号。每个结点存储它的父节点,p[x]表示x的父节点
// 问题1:如何判断树根if(p[x] == x)
// 问题2:如何求x的集合编号:while(p[x] != x) x = p[x]
// 问题3:如何合并两个集合 px 是x的集合编号,py是y的集合编号 p[px] = py;
#include <iostream>
using namespace std;
const int N = 100010;
int p[N]; // 并查集 一个变量 p[N] 一个函数 find(x) ,还有三个小操作,初始化,合并集合,判断是否同一个集合
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) p[i] = i; // 并查集的初始化,n的编号从1开始到n
char op[2];
int a, b;
while (m -- )
{
scanf("%s%d%d", op, &a, &b);
if (op[0] == 'M') p[find(a)] = find(b);
else
{
if (find(a) == find(b)) puts("Yes");
else puts("No");
}
}
return 0;
}//并查集:1.将两个集合合并
// 2.查询两个元素是否在同一集合
//基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号。每个结点存储它的父节点,p[x]表示x的父节点
// 问题1:如何判断树根if(p[x] == x)
// 问题2:如何求x的集合编号:while(p[x] != x) x = p[x]
// 问题3:如何合并两个集合 px 是x的集合编号,py是y的集合编号 p[px] = py;
#include <iostream>
using namespace std;
const int N = 100010;
int p[N]; // 并查集 一个变量 p[N] 一个函数 find(x) ,还有三个小操作,初始化,合并集合,判断是否同一个集合
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) p[i] = i; // 并查集的初始化,n的编号从1开始到n
char op[2];
int a, b;
while (m -- )
{
scanf("%s%d%d", op, &a, &b);
if (op[0] == 'M') p[find(a)] = find(b);
else
{
if (find(a) == find(b)) puts("Yes");
else puts("No");
}
}
return 0;
}