解題報告:
思路:可以定義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;
}