POJ 1611 The Suspects 帶權並查集

解題報告:

思路:可以定義cnt數組,記錄以 i 節點的父親節點所包含的感染人數。其它的基本是帶權並查集的模板。

代碼:

#include <iostream>
#include <cstdio>

using namespace std;
typedef long long ll;

const ll N = 3e4+10;

ll rt[N], cnt[N];
ll num[N];
ll n, m, k;

void init(){
    for(ll i=0; i<n; ++i){
        rt[i] = i;
        cnt[i] = 1;
    }
}

ll Find(ll x){
    if(x != rt[x]){
        ll root = rt[x];
        rt[x] = Find(rt[x]);
        cnt[x] += cnt[root];
    }
    return rt[x];
}

void Union(ll x, ll y){
    ll rtx = Find(x);
    ll rty = Find(y);
    if(rtx == rty)return ;
    rt[rtx] = rty;
    cnt[rty] += cnt[rtx];
}

void solve(){
    for(ll i=0; i<m; ++i) {
        scanf("%lld", &k);
        for (ll j = 0; j < k; ++j) {
            scanf("%lld", num + j);
            if (j > 0)Union(num[j], num[j - 1]);
        }
    }
    ll root = Find(0);
    printf("%lld\n", cnt[root]);
}

int main(){
    while(~scanf("%lld%lld", &n, &m)){
        if(n == 0 && m == 0)break;
        init();
        solve();
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章