带权并查集+最小生成树

https://www.luogu.org/problem/P1196

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int fa[maxn],sum[maxn],son[maxn];
struct dd {
    int faa,val;
    dd(int xx=0,int yy=0):faa(xx),val(yy) {
    }
};
int getf(int x) {
    if(fa[x]==x)return x;
    else {
        int fa1=getf(fa[x]);
        sum[x]+=sum[fa[x]];
        return fa[x]=fa1;//传回去的不能直接用
    }
}
int get_son(int x) {
    if(son[x]==x)return x;
    else {
        return son[x]=get_son(son[x]);
    }
}
int size[maxn];//重点
int main() {
    int t;
    cin>>t;
    for(int i=1; i<=30000+10; i++)fa[i]=i,sum[i]=0,son[i]=i,size[i]=1;
//初始化一定要为0
    // a 是自己开一个a所在的是加到b下面
    for(int i=1; i<=t; i++) {
        char d;
        cin>>d;
        if(d=='C') {
            int x,y;
            cin>>x>>y;
            int r=getf(x);
            int k=getf(y);
            if(r!=k) {
                cout<<"-1"<<endl;
            } else
                cout<<abs(sum[x]-sum[y])-1<<endl;
        } else {
            int x,y;
            cin>>x>>y;
            int r=getf(x),r1=getf(y),son1=get_son(y);
            son[son1]=r;
            fa[r]=r1;//直接转为最上面的,要不然,你会炸的很惨。因为会多算
            sum[r]=size[r1];//它上面有多少?
            size[r1]+=size[r];
        }
    }

    return 0;
}

自己构造的一组数据,却成了环。。。。。。我吐,写出来警示后人

1000
M 1 2
M 2 3
C 1 3
M 4 5
M 5 6
M 6 1
C 2 4

M 3 4
C 2 4

C 4 3

C 2 5

C 4 3

C 4 3

C 4 3

C 4 3

C 4 3

全部评论

相关推荐

offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
一个非常好用的遍历方法
AomaYple:不是指针,是引用
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务