并查集
并查集是经典的图论算法,用来维护点与集合的关系,代码也简洁明了。
给定
个点,有
次操作,每次操作输入
。
若
,则 合并
;
若
,则 查询
是否同属一个集合;
并查集初始化:每个父亲点 都 存储 儿子的信息:
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;
}