[アルゴリズムの基礎]837。接続されたブロックのポイント数(グラフ理論+ユニオン検索)

ここに画像の説明を挿入


トピックの説明

トピックリンク
ここに画像の説明を挿入

アイデア

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;
}

おすすめ

転載: blog.csdn.net/weixin_49486457/article/details/123973518