这题其实很早就过了,但是呢,以前过的时候真的基本上是CtrlC+CtrlV,这次把代码重新码了一遍,对并查集也有了一个基本清晰的认识
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 using namespace std; 7 8 int n,m; 9 int fa[10005]; 10 11 int find(int zy){//查找该集合代表元(根节点) 12 if(zy==fa[zy]){ 13 return zy; 14 } 15 return fa[zy]=find(fa[zy]); 16 } 17 18 void merge(int z,int y){//合并操作 19 fa[find(z)]=fa[find(y)]; 20 } 21 22 int main(){ 23 scanf("%d%d",&n,&m); 24 for(int i=1;i<=n;i++){ 25 fa[i]=i; 26 } 27 for(int i=1;i<=m;i++){ 28 int x,y,z; 29 scanf("%d%d%d",&x,&y,&z); 30 if(x==2){ 31 if(find(y)==find(z)){//若在同一集合 32 printf("Y "); 33 continue; 34 } 35 printf("N "); 36 } 37 else{ 38 merge(y,z); 39 } 40 } 41 return 0; 42 }
嗯基本就是这样了