0
点赞
收藏
分享

微信扫一扫

并查集

云岭逸人 2022-02-05 阅读 108

并查集:合并、查找集合。

典型例题:

一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。

现在要进行 m 个操作,操作共有两种:

  1. M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;

输入格式:

       第一行输入整数 n 和 m。

       接下来 m 行,每行包含一个操作指令,指令为 M a bQ a b 中的一种。

输出格式:

        对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出 Yes,否则输出 No。每个结果占一行。

数据范围:

        1≤ n , m ≤100000

输入样例:

4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4

输出样例:

Yes
No
Yes

解题代码: 

# include <iostream>
using namespace std;
const int N = 100010;
int p[N];
int find(int x)
{
	if (p[x] != x)
	{
		p[x] = find(p[x]);
	}
	return p[x];

}
int main()
{
	ios::sync_with_stdio(false);
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		p[i] = i;//p[i]储存的是i的父节点
	}
	char wor;
	while(m--)
	{
		int a, b;
		cin >> wor >> a >> b;
		if(wor=='M')
		{
			p[find(a)] = find(b);
		}
		else if(wor=='Q')
		{
			if(find(a)==find(b))
		{
			puts("Yes");
		}
			else 
			{
				puts("No");
			}
		}
	}
	return 0;
}

其中 find 函数 

 

 

 

举报

相关推荐

[并查集][C++]并查集模板

并查集__

java并查集

并查集模板

并查集漫谈

0 条评论