记录元素个数的并查集。
利用sz数组保存并查集的大小。每次union时,把小的集合并到大的中去,并更新sz数组。
#include#include 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