# include <stdio.h> # include <string.h> int node[1005]; int getfather(int a) { return (node[a]==a)?a:(node[a]=getfather(node[a])); } int main () { int m,n,i; int a,b,mark; while(scanf("%d",&m)!=EOF) { if(m==0) break; scanf("%d",&n); for(i=0;i<=m;i++) {node[i]=i;} for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); int t1 = getfather(a); int t2 = getfather(b); node[a]=t1; node[b]=t2; if(t1!=t2) { node[t2]=t1; } } mark=0; for(i=1;i<=m;i++) if(node[i]==i) mark++; printf("%d\n",mark-1); } return 0; } 并查集的问题 注意 node[t2]=t1; 这样才是把两棵树合并成一棵树