<span style="font-size:12px;">#include<cstdio> int id[50001],sz[50001],n,m; int find(int p) { while(p!=id[p]) { // 路径压缩,会破坏掉当前节点的父节点的尺寸信息,因为压缩后,当前节点的父节点已经变了 id[p]=id[id[p]]; p=id[p]; } return p; } void un(int p,int q) { int i=find(p); int j=find(q); if(i==j) return; if(sz[i]<sz[j]) { id[i]=j; sz[j]+=sz[i];} // 按秩进行合并 else {id[j]=i;sz[i]+=sz[j];} n--; // 每次合并之后,树的数量减1 } int main() { //freopen("a.txt","r",stdin); int a,b,i,j=1; while(scanf("%d%d",&n,&m)!=EOF&&n+m) { for(i=1;i<=n;i++) { id[i]=i; sz[i]=1; } for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); un(a,b); } printf("Case %d: %d\n",j++,n); } return 0; } </span>
原文地址:http://blog.csdn.net/u012773338/article/details/38795027