P3367 【模板】并查集

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入输出格式

输入格式:

 

第一行包含两个整数N、M,表示共有N个元素和M个操作。

接下来M行,每行包含三个整数Zi、Xi、Yi

当Zi=1时,将Xi与Yi所在的集合合并

当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N

 

输出格式:

 

如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N

 

输入输出样例

输入样例#1: 复制
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出样例#1: 复制
N
Y
N
Y

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据,N<=10,M<=20;

对于70%的数据,N<=100,M<=1000;

对于100%的数据,N<=10000,M<=200000。

 

看清楚了,模板啊可是!

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #define MAXN 200000
 7 using namespace std;
 8 
 9 int fa[MAXN],tmp;
10 int n,m,p,c,l,a,b;
11 
12 int find(int x)
13 {
14     if(fa[x]!=x) return fa[x]=find(fa[x]);
15     return x;
16 }
17 
18 void add(int x,int y)
19 {
20     x=find(x);
21     y=find(y);
22     fa[x]=y;
23 }
24 
25 int main()
26 {
27     scanf("%d%d",&n,&m);
28     for(int i=1; i<=n; i++)
29         fa[i]=i;
30     for(int i=1; i<=m; i++)
31     {
32         scanf("%d%d%d",&a,&b,&c);
33         if(a==1) add(b,c);
34         if(a==2)
35         {
36             int t1=find(b),t2=find(c);
37             if(t1==t2)
38                 printf("Y\n");
39             else
40                 printf("N\n");
41         }
42     }
43     return 0;
44 }

 


如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,跟个zz一样看着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。
时间时间会给你答案2333
posted @ 2018-08-03 14:53  孟东行#  阅读(310)  评论(0编辑  收藏  举报