并查集
up记录x上面的个数,sum记录总数
View Code
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=30010; 6 int set[N],up[N],sum[N]; 7 int find(int x) 8 { 9 if(x==set[x]) return x; 10 int t=find(set[x]); 11 up[x]+=up[set[x]]; 12 return set[x]=t; 13 } 14 int main() 15 { 16 int P; 17 while(~scanf("%d",&P)) 18 { 19 for(int i=0;i<N;i++) 20 { 21 set[i]=i; 22 sum[i]=1; 23 up[i]=0; 24 } 25 while(P--) 26 { 27 char op[2]; 28 scanf("%s",op); 29 if(op[0]=='M') 30 { 31 int x,y; 32 scanf("%d%d",&x,&y); 33 int fx=find(x), fy=find(y); 34 if(fx==fy) continue; 35 set[fy]=fx; 36 up[fy]=sum[fx]; 37 sum[fx]+=sum[fy]; 38 } 39 if(op[0]=='C') 40 { 41 int x; 42 scanf("%d",&x); 43 int fx=find(x); 44 printf("%d\n",sum[fx]-up[x]-1); 45 } 46 } 47 } 48 return 0; 49 }