复习一遍并查集 用并查集做这个题目 效率看起来是比DFS要高一点的
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10010;
vector<int> G[MAXN];
int numCnt = 0;
int n;
int num = 0;
bool vis[MAXN];
void DFS(int u)
{
vis[u] = true;
if(u < n)
{
num++;
}
if(G[u].size() != 0)
{
for(int v = 0;v < G[u].size();v++)
{
if(vis[G[u][v]] == false)
{
DFS(G[u][v]);
}
}
}
}
vector<int> ans;
bool cmp(int a,int b)
{
return a > b;
}
int main(void)
{
freopen("pat0314/in.txt","r",stdin);
cin>>n;
for(int i = 0;i<n;i++)
{
int num;
scanf("%d:",&num);
if(num != 0)
{
for(int j = 0;j<num;j++)
{
int t;
cin>>t;
G[i].push_back(n + t);
G[n + t].push_back(i);
}
}
}
fill(vis,vis + MAXN,false);
for(int i = 0;i<n;i++)
{
if(vis[i] == false)
{
num = 0;
DFS(i);
ans.push_back(num);
numCnt++;
}
}
printf("%d\n",ans.size());
sort(ans.begin(),ans.end(),cmp);
for(int i = 0;i < ans.size();i++)
{
if(0 == i)
{
printf("%d",ans[i]);
}
else
{
printf(" %d",ans[i]);
}
}
return 0;
}