一个玄学的问题(本萌新有点不懂啊?)
查看原帖
一个玄学的问题(本萌新有点不懂啊?)
545026
syLph楼主2022/5/28 15:44

以下是我的代码

#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了???

2022/5/28 15:44
加载中...