Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 21567 | Accepted: 7554 | |
Case Time Limit: 1000MS |
Description
Input
Output
Sample Input
6 M 1 6 C 1 M 2 4 M 2 6 C 3 C 4
Sample Output
1 0 2
题解:和龙珠那题一样,坑了半天,写的都醉了。。。
代码贴上:
1 #include<stdio.h> 2 #include<string.h> 3 const int MAXN=30010; 4 int pre[MAXN],s[MAXN],dep[MAXN];//s数组存当前树的节点数; 5 int find(int x){ 6 if(x!=pre[x]){ 7 int t=pre[x]; 8 pre[x]=find(pre[x]); 9 dep[x]+=dep[t]; 10 } 11 /* int i=x,j; 12 while(i!=r){ 13 j=pre[i];pre[i]=r;i=j; 14 }*/ 15 return pre[x]; 16 } 17 void merge(int x,int y){ 18 int f1,f2; 19 f1=find(x);f2=find(y); 20 // printf("%d %d\n",f1,f2); 21 if(f1!=f2){ 22 pre[f2]=f1; 23 dep[f2]=s[f1]; 24 s[f1]+=s[f2]; 25 } 26 } 27 int main(){ 28 int N,x,y; 29 char c[5];//定义成s了,错的啊。。。。 30 while(~scanf("%d",&N)){ 31 for(int i=1;i<=N;i++)pre[i]=i,dep[i]=0,s[i]=1; 32 while(N--){ 33 scanf("%s",c); 34 if(c[0]==‘M‘){ 35 scanf("%d%d",&x,&y); 36 merge(x,y); 37 } 38 else { 39 scanf("%d",&x); 40 int px=find(x); 41 // printf("s[%d]=%d %d\n",px,s[px],dep[x]); 42 printf("%d\n",s[px]-dep[x]-1); 43 } 44 } 45 } 46 return 0; 47 }
原文:http://www.cnblogs.com/handsomecui/p/4842376.html