POJ1611-The Suspects-并查集
记录元素个数的并查集。
利用sz数组保存并查集的大小。每次union时,把小的集合并到大的中去,并更新sz数组。
#include <cstdio> #include <algorithm> using namespace std; int n,m,k; int fa[30010],sz[30010]; int Find(int x) { while(x != fa[x]) { fa[x] = fa[fa[x]]; x = fa[x]; } return x; } void Union(int p,int q) { int fp = Find(p),fq = Find(q); if(fp == fq) return; if(sz[fp] < sz[fq]) { fa[fp] = fq; sz[fq] += sz[fp]; } else { fa[fq] = fp; sz[fp] += sz[fq]; } } int main() { while(scanf("%d%d",&n,&m) && (n||m)) { for(int i=0;i<n;i++) { fa[i] = i; sz[i] = 1; } for(int i=0;i<m;i++) { scanf("%d",&k); int root = 0,p; for(int i=0;i<k;i++) { scanf("%d",&p); if(!i) root = p; else Union(p,root); } } printf("%d\n",sz[Find(0)]); } }