为什么这么简单的题我竟然空下了!!!呃呃呃呃呃呃呃!
#include <iostream> using namespace std; int n, m, k, t, f, p[30001], rank[30001], a, b; int find(int x) { if (x == p[x]) return x; else return p[x] = find(p[x]); } void un(int x, int y) { a = find(x); b = find(y); if (a == b) return; if (rank[a] > rank[b]) p[b] = a; else { p[a] = b; if (rank[a] == rank[b]) rank[b]++; } } int main() { int i, sum; while (cin >> m >> n && (m || n)) { for (i = 0; i < m; i++) { p[i] = i; rank[i] = 0; } for (i = 0; i < n; i++) { cin >> k; if (k >= 1) cin >> f; for (int j = 1; j < k; j++) { cin >> t; un(f, t); } } sum = 1; for (i = 1; i < m; i++) { if (find(i) == find(0)) sum++; } cout << sum << endl; } }