AcWing 836. 合并集合
共有n个数,编号是1~n,最开始每个数各自在一个集合中。
现在要进行m个操作,操作共有两种:
- “M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
- “Q a b”,询问编号为a和b的两个数是否在同一个集合中
#include<bits/stdc++.h> using namespace std; const int N =1e5+10; int p[N]; int find(int a) { if (p[a]!=a)p[a]=find(p[a]); return p[a]; } int main() { int n, m; scanf("%d %d",&n,&m); for (int i=1;i<=n;i++)p[i]=i; int a,b; char op[2]; while (m--) { scanf("%s %d%d",op,&a,&b); if (op[0]=='M') p[find(a)]=find(b); else { if (find(a)==find(b)) puts("Yes"); else puts("No"); } } return 0; }

浙公网安备 33010602011771号