思路:统计出和0能够联系在一起的点,然后输出其个数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include#include #define maxn 30004 using namespace std; int f[maxn],num[maxn];//num记录与0有联系的个数 int n,m; int find(int x) { if (x != f[x]) { f[x] = find(f[x]); } return f[x]; } void Union(int x,int y) { x = find(x); y = find(y); if (x != y) { f[y] = x; num[x] += num[y];//根记录子系的个数 } } int main() { int i,j,a,b,k; while (cin>>n>>m) { if (!n && !m) break; for (i = 0; i <= n; ++i) { f[i] = i; num[i] = 1; } for (i = 0; i < m; ++i) { cin>>k; if (k) cin>>a; for (j = 1; j < k; ++j) { cin>>b; Union(a,b); } } int pos = find(0);//找到0所在的子系的根 printf("%d\n",num[pos]); } return 0; }