hdu1232
来源:互联网 发布:手机高清网络电视 编辑:程序博客网 时间:2024/05/21 08:05
#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 1010int tag[N];int pre[N];int find(int x){ int i=x; while(pre[i]!=i) { i=pre[i]; } int k=x,j; while(pre[k]!=i)//将所有的与x有关联的数都合并到i下面 { j=pre[k]; pre[k]=i; k=j; } return i;}void mix(int x,int y){ int fx=find(x);//找到父亲先,这样才能降低路径!! int fy=find(y);//这个要加上,否者TLE if(fx!=fy) pre[fx]=fy;}int main(){ int i,j,n,m,A,B,ans; while(scanf("%d%d",&n,&m)&&n) { for(i=1;i<=n;i++) pre[i]=i; for(i=1;i<=m;i++) { scanf("%d%d",&A,&B); mix(A,B); } memset(tag,0,sizeof(tag)); for(i=1;i<=n;i++) { tag[find(i)]=1; } for(ans=0,i=1;i<=n;i++) { if(tag[i]) ans++; } ans--; printf("%d\n",ans); } //system("pause"); return 0; }/*4 21 34 33 31 21 32 35 21 23 5999 00*/