思路:直接用并查集,最后找到 0 所在的集合,把 集合中的 人数 输出即可
#include<iostream> using namespace std; const int maxn=30000 +100; int set[maxn]; int sum[maxn]; int set_find(int d) { if(set[d]<0) return d; return set[d]=set_find(set[d]); } void join(int x,int y) { x=set_find(x); y=set_find(y); set[x]=y; } int main() { int n,m; int k; while(cin>>n>>m) { if(n==0 &&m==0) break; memset(set,-1,sizeof(set)); memset(sum,0,sizeof(sum)); int i; for(i=0;i<n;i++) sum[i]=1; while(m--) { cin>>k; int a,b; k--; cin>>a; while(k--) { cin>>b; if(set_find(a)!=set_find(b)) { sum[set_find(b)]=sum[set_find(b)]+sum[set_find(a)];//先求和 join(set_find(a),set_find(b));//再 合并,把 根合并 } a=b; } } cout<<sum[set_find(0)]<<endl; } }