前言

父父子子,君君臣臣。。。并查集也。。。

1.思想

用一个fa[]数组储存该元素的父亲,如果两个元素的父亲是同一个元素,那么它们就在同一个并查集里。

2.并查集模板题

【题目链接】
洛谷【3367】
【题目描述】
如题,现在有一个并查集,你需要完成合并和查询操作。
【输入格式】
第一行包含两个整数N、M,表示共有N个元素和M个操作。
接下来M行,每行包含三个整数Zi、Xi、Yi;
当Zi=1时,将Xi与Yi所在的集合合并;
当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N。
【输出格式】
如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N。
【输入样例】

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

【输出样例】

N
Y
N
Y

【程序】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<cstdio>
#include<iostream>
#define M 500500
using namespace std;
int n,m;
int fa[M];
inline void reinit()
{
for(int i=1;i<=n;++i)
{
fa[i]=i;
}
}
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
int pd(int x,int y)
{
if(find(x)==find(y)) return 1;
return 0;
}
inline void un(int x,int y)
{
fa[find(x)]=find(y);
}
int main()
{
scanf("%d%d",&n,&m);
reinit();
int t,ta,tb;
while(m--)
{
scanf("%d%d%d",&t,&ta,&tb);
if(t==1)
{
un(ta,tb);
}
if(t==2)
{
if(pd(ta,tb))
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}