1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #include <cstdio>
- using namespace std;
- const int N = 30000;
- const int M = 500;
- int n, m;
- struct UF {
- int id[N];
- int sz[N];
- };
- UF uf;
- int find(int i) {
- if (i == uf.id[i]) return i;
- int j = find(uf.id[i]);
- uf.id[i] = j;
- return j;
- }
- void join(int i, int j) {
- i = find(i);
- j = find(j);
- if (i == j) return;
- if (uf.sz[i] < uf.sz[j]) {
- uf.id[i] = j;
- uf.sz[j] += uf.sz[i];
- } else {
- uf.id[j] = i;
- uf.sz[i] += uf.sz[j];
- }
- }
- int main() {
- for (;;) {
- scanf("%d %d", &n, &m);
- if (n == 0 && m == 0) break;
- for (int i = 0; i < n; i++) {
- uf.id[i] = i;
- uf.sz[i] = 1;
- }
- for (int i = 0, k, u, v; i < m; i++) {
- scanf("%d", &k);
- scanf("%d", &u);
- for (int j = 1; j < k; j++) {
- scanf("%d", &v);
- join(u, v);
- }
- }
- printf("%d\n", uf.sz[find(0)]);
- }
- return 0;
- }
|