P3367 【模板】并查集
#include<iostream> #include<algorithm> using namespace std; const int maxm=10010; int pre[maxm]; int n,m; void make()//初始化 { for (int i=1;i<=n;i++) { pre[i]=i; } } int find(int x)//查询,并进行路径压缩 { int r=x; while (pre[r]!=r) { r=pre[r]; } int i=x,j; while (i!=r) { j=pre[i]; pre[i]=r; i=j; } return r; } void Union(int x,int y)//合并 { int fx=find(x); int fy=find(y); if (fx==fy) return ; else { pre[fx]=fy; } } int main() { cin>>n>>m; make(); for (int i=1;i<=m;i++) { int r,x,y; cin>>r>>x>>y; if (r==1) { Union(x,y); } else if(r==2) { if (find(x)==find(y)) { cout<<"Y"<<endl; } else { cout<<"N"<<endl; } } } } /* 输入 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 */