水了几道并查集的题练练手 题意 : 如图 代码:
#include<iostream> #include<queue> #include<stack> #include<cstring> #include<stdlib.h> #include<cstdio> using namespace std; int n, m; int k; int f[500001], t[500001]; void init(int n){ for(int i = 0; i < n; i++) f[i] = i; } int find(int x){ if(f[x] != x) f[x] = find(f[x]); return f[x]; } bool same(int x, int y){ if(find(x) == find(y)) return true; return false; } void unionn(int x, int y){ int t1 = find(x); int t2 = find(y); if(t1 != t2){ f[t1] = t2; } } int main(){ while(cin >> n >> m ){ if(n == 0) break; if(m == 0){ cout << 1 << endl; continue; } init(n); for(int i =0 ; i < m; i++){ cin >> k; int m; cin >> m; int mm; for(int j = 1; j < k; j++){ cin >> mm; unionn(m, mm); } } int ans = 0; for(int i = 0; i < n; i++){ if(find(0) == find(i)) ans++; } cout << ans << endl; } }