A. Learning Languages

https://codeforces.com/problemset/problem/277/A

It presents a problem that we need to make all element connected, it can be solved by using dsu.
I didn't use my dsu model and write a simple version of Dsu.

class DSU{
public:
DSU(int m): size_(m){
fa_.resize(m);
std::iota(fa_.begin(), fa_.end(), 0);
}

int findSet(int x){
return fa_[x] == x ? x : fa_[x] = findSet(fa_[x]);
}

bool isSameSet(int x, int y){
return findSet(x) == findSet(y);

}

bool unionSet(int u, int v){
u = findSet(u);
v = findSet(v);
if (u == v){
return false;
}
return fa_[u] = v, true;
}

private:
vector fa_;
int size_;
};

void solve(){
int n, m;
cin >> n >> m;

DSU dsu(m + 1);
vector vis(m + 1);
int ans = 0;
for (int i = 0; i < n; ++i){
int k;
cin >> k;
if (!k){
ans ++;
}
int pre = -1;
while (k --){
int t;
cin >> t;
if (pre != -1){
dsu.unionSet(pre, t);
}
pre = t;
vis[t] = true;
}
}

for (int i = 1; i <= m; ++i){
for (int j = i + 1; j <= m; ++j){
if (vis[i] && vis[j] && dsu.isSameSet(i, j) == false){
dsu.unionSet(i, j);
ans ++;
}
}
}

cout << ans << '\n';
}

posted @ 2024-03-07 21:10  _Yxc  阅读(39)  评论(0)    收藏  举报