トピックの説明
アイデア
if(find(a) == find(b)) continue;
siz[find(b)] += siz[find(a)];//在根节点上加上另一个树节点的古树
p[find(a)] = find(b);
接続されたブロックをセットと見なし、
siz
配列を開いて2つの接続されたブロックのノード数を記録します.2つの接続されたブロックがマージされます。つまり、2つのsiz
配列を追加できますが、親に追加する必要があります最初にルートノードを追加し、親ノードを更新a,b
し、同じ接続ブロック内にある場合は、操作を直接挿入する必要がないことに注意してください。continue
コード1
#include <bits/stdc++.h>
using namespace std ;
const int N = 100010;
int n, m;
int siz[N], p[N];
int find (int x) {
if(p[x] != x) {
p[x] = find(p[x]);
}
return p[x];
}
int main () {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
p[i] = i;
siz[i] = 1;
}
char op[5];
while (m --) {
cin >> op;
int a, b;
if(op[0] == 'C') {
cin >> a >> b;
if(find(a) == find(b)) continue;
siz[find(b)] += siz[find(a)];//在根节点上加上另一个树节点的古树
p[find(a)] = find(b);
} else if(op[1] == '1') {
cin >> a >> b;
if(find(a) == find(b)) {
puts("Yes");
} else {
puts("No");
}
} else {
cin >> a;
cout << siz[find(a)] << endl;
}
}
return 0;
}