#include <stdio.h> int p[1005]; int find(int x) //这个的作用就是下面的查找。 { if(x!=p[x]) p[x]=find(p[x]); return p[x]; } int hebing(int x,int y) //这个的作用就是用来合并的。 { return p[x]=y; //假设a=2,b=3,此时应该有p[2]=p[3]=3。即2和3到同一张桌子了。 } int main() { int t,i,a,b; scanf("%d",&t); while(t--) { int n,m,ans=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) p[i]=i; //初始化它,让编号为一的值为1,编号为2的值为2.以此类推。 for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); a=find(a); b=find(b); //假设a=2,b=3,我认为经过这个查找之后p[2]就等于p[3]了。 if(a!=b) hebing(a,b); //合并为一个值。 } for(i=1;i<=n;i++) { if(p[i]==i) //经过M次合并之后,如果是朋友,或者间接朋友的,他们对应的值都为同一个。所以桌子就减少了。 ans++; //如果值还是对应的,那么就不是朋友关系,增加一张桌子。 } printf("%d\n",ans);//输出注意格式,只有一个空行。 } return 0; }
hdu Problem - 1213 http://acm.hdu.edu.cn/showproblem.php?pid=1213