并查集
但是第二步求x的编号需要0(n) 的 时间复杂度。 需要进行优化;
压缩路径:
就是运用递归的方法,在找x的祖宗节点的时候,顺便把这一路上的父节点都连到祖宗节点上,那么下一次查询祖宗节点的时候只需0(1)的时间复杂度就可以了。
int find(int x) { if(f[x] != x) f[x] = find(f[x]); return f[x]; }
#includeusing namespace std; const int N = 100010; int p[N]; int n, m; int find(int x) { if(x != p[x]) p[x] = find(p[x]); return p[x]; } int main() { cin >> n >> m; for(int i = 1; i <= n; i++) p[i] = i; while(m--) { char op; int a, b; cin >> op >> a >> b; if(op == 'M') { p[find(a)] = find(b); } else { if(find(a) == find(b)) cout << "Yes" << endl; else cout << "No" << endl; } } return 0; }