1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
using namespace std; const int maxn = 1000+5; const int INF = 0x3f3f3f3f; const double eps = 1e-6; const int MOD = 1e9+7; const int sqrN = 316; typedef long long ll; #define pb push_back #define pp pop_back #define lowbit(x) ((x)&(-x)) #define mst(a,b) memset(a,b,sizeof(a))
int pre[maxn],hobby[maxn],res[maxn]; void () { for (int i = 1; i <= maxn; ++i) pre[i] = i; } int find(int x) { if (x == pre[x]) return x; else { int r = find(pre[x]); pre[x] = r; return r; } } void Union(int a,int b) { int Ra = find(a); int Rb = find(b); if (Ra != Rb) pre[Ra] = Rb; }
int main() { #ifdef ONLIGE_JUDGE #else freopen("H:\in.txt","r",stdin); #endif makeSet(); int n,t,cnt = 0; scanf("%d",&n); for (int i = 1, k; i <= n; ++i) { scanf("%d:",&k); for (int j = 1; j <= k; ++j) { scanf("%d",&t); if (!hobby[t]) hobby[t] = i; Union(i,find(hobby[t])); } } for (int i = 1; i <= n; ++i) { res[find(i)]++; } for (int i = 1; i <= n; ++i) { if (res[i]) cnt++; } cout << cnt << endl; sort(res+1,res+n+1,greater<int>()); for (int i = 1; i <= cnt; ++i) printf("%d%c",res[i],i==cnt ? 'n' : ' '); return 0; }
|
近期评论