以下是我的代码
#include<stdio.h>
int fa[100001],size[100001],d[100001];
int abs(int a){return (a < 0) ? -a : a;}
int find(int x){
if (fa[x] == x ) return x;
int root = find(fa[x]);
d[x] += d[fa[x]];
return fa[x] = root;
}
void merge(int x,int y){
x = find(x),y = find(y);
fa[x] = y,d[x] = size[y];
size[y] += size[x];
size[x] = 0;
return;
}
int is_linked(int a,int b){
return ( find(a) == find(b) ) ? 1 : 0;
}
int main(){
//freopen("testdata.in","r",stdin);
int n;
scanf("%d",&n);
for (int i = 1 ; i <= 30001 ; i ++ ){
fa[i] = i;
size[i] = 1;
}
for (int i = 0 ; i < n ; i ++ ){
char c;int a,b;
while (1){
c = getchar();
if ( 'A' <= c && c <= 'Z' ) break;
}
scanf("%d %d",&a,&b);
if ( c == 'M' ){
merge(a,b);
}
else if ( c == 'C'){
int flag = is_linked(a,b);
if ( flag == 0 ) puts("-1");
else{
printf("%d\n",abs(d[a]-d[b])-1);
}
}
}
return 0;
}
为啥我把
for (int i = 1 ; i <= n ; i ++ ){
fa[i] = i,size[i] = 1;
}
改成了
for (int i = 1 ; i <= 30001 ; i ++ ){
fa[i] = i;
size[i] = 1;
}
本来?2个点 然后就AC了???