杭电 HOJ 3635 Dragon Balls 解题报告
第一次接触并查集。其实也不复杂,看代码应该很容易懂的:
#include <iostream> using namespace std; int s[10001],mov[10001],num[10001]; int find(int a) { if(s[a]) { int temp=s[a]; s[a]=find(s[a]); mov[a]+=mov[temp]; return s[a]; } return a; } void bing(int a,int b) { a=find(a); b=find(b); num[b]+=num[a]; s[a]=b; mov[a]=1; } int main() { char ch[2]; int n,m,i,j,cas,c=1; scanf("%d",&cas); while(cas--) { printf("Case %d:\n",c++); scanf("%d%d",&n,&m); memset(s,0,sizeof(s)); memset(mov,0,sizeof(mov)); for(i=1;i<=n;i++) num[i]=1; while(m--) { scanf("%s%d",ch,&i); if(ch[0]=='T') { scanf("%d",&j); bing(i,j); } else { j=find(i); printf("%d %d %d\n",j,num[j],mov[i]); } } } }