标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4346 Accepted Submission(s):
1658
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define max 10002 5 using namespace std; 6 int father[max],ran[max],num[max]; 7 int a,b; 8 9 void init() 10 { 11 int i; 12 for(i=1;i<=a;i++) 13 { 14 father[i]=i;//记录父节点 15 ran[i]=1;//记录所在城市共有多少龙珠 16 num[i]=0;//记录移动的次数 17 } 18 } 19 20 int find(int x) 21 { 22 if(x==father[x]) return x; 23 int t=father[x]; 24 father[x]=find(father[x]);//压缩路径 ,都指向根节点 25 num[x]+=num[t];//每个球移动的次数等于本身移动的个数加上父节点移动的次数 26 return father[x]; 27 } 28 29 void join(int x,int y) 30 { 31 int fx=find(x); 32 int fy=find(y); 33 if(fx!=fy) 34 { 35 father[fx]=fy;//移动一个根节点到另一个根节点 36 ran[fy]+=ran[fx];//fy为根节点的总个数等于两个根节点拥有的个数相加 37 num[fx]=1;//被移动的根节点第一次移动 38 } 39 } 40 41 int main() 42 { 43 int i,N,m,n,cot=1; 44 char c; 45 scanf("%d",&N); 46 while(N--) 47 { 48 scanf("%d%d",&a,&b); 49 getchar(); 50 init(); 51 printf("Case %d:\n",cot++); 52 for(i=0;i<b;i++) 53 { 54 scanf("%c",&c); 55 if(c==‘T‘) 56 { 57 scanf("%d%d",&m,&n); 58 getchar(); 59 join(m,n); 60 } 61 else 62 { 63 scanf("%d",&m); 64 getchar(); 65 int t=find(m);//要输出根节点的所有的个数 66 printf("%d %d %d\n",t,ran[t],num[m]); 67 } 68 } 69 } 70 return 0; 71 }
标签:
原文地址:http://www.cnblogs.com/Eric-keke/p/4694473.html