【模版】并查集


并查集


并查集是经典的图论算法,用来维护点与集合的关系,代码也简洁明了。

给定 N N 个点,有 M M 次操作,每次操作输入 p p a a b b
p = 1 p = 1 ,则 合并 a a b b
p = 2 p = 2 ,则 查询 a a b b 是否同属一个集合;

并查集初始化:每个父亲点 都 存储 儿子的信息:

for(int i = 1; i <= n; i++)	fa[i] = i;

并查集的查询(路径压缩版):

int find(int x)
{
	if(x == fa[x])	return x;
	else	return fa[x] = find(fa[x]);
}

并查集的合并:

int x = find(a), y = find(b);
if (x != y)	fa[x] = y; 

并查集模版完整代码:

#include <iostream>
#include <cstdio>
using namespace std;
int n,m;
int fa[1001000];
int find(int x)
{
	if(x == fa[x])	return fa[x];
	else	return fa[x] = find(fa[x]);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n; i++)	fa[i] = i;
	for(int i = 1; i <= m; i++)
	{
		int p,b,c;
		scanf("%d%d%d",&p,&b,&c);
		int x = find(fa[b]);
		int y = find(fa[c]);
		if(p == 1)	fa[x] = y;
		if(p == 2)
		{
			if(x == y)	printf("Y\n");
			else	printf("N\n");
		}
	}
	return 0;
}

训练题目:
[模版]并查集
[模版]最小生成树
团伙
银河英雄传说

发布了10 篇原创文章 · 获赞 10 · 访问量 676

猜你喜欢

转载自blog.csdn.net/LH_991215/article/details/104190361