Cube Stacking

Cube Stacking

https://ac.nowcoder.com/acm/problem/106585

思路

先贴个翻译
图片说明

很明显是裸裸的并查集。

先开一个fa数组表示这个箱子在哪个集合中,要合并就直接把fa【x】 = y就表示集合x加入到集合y里面

开一个ran数组统计每个集合中的数量,合并的时候就把该集合的ran加到另外一个集合就好

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int fa[30005],ran[30005],size[30005];
inline void init(){
    for(int i=1;i<=30005;i++){
        fa[i]=i;
        ran[i]=0;
        size[i]=1;
    }
}
int find(int x){
    if(x==fa[x])    return x;
    else{
        int t=fa[x];
        fa[x]=find(fa[x]);
        ran[x]+=ran[t];
        return fa[x];
    }
}
inline void merge(int i,int j){
    int x=find(i),y=find(j);
    fa[x]=y;
    ran[x]+=size[y];
    size[y]+=size[x];
}
int main(){
    int t,a,b;
    char ch;
    init();
    scanf("%d",&t);
    while(t--){
        scanf(" %c",&ch);
        if(ch=='M'){
            scanf("%d%d",&a,&b);
            merge(a,b);
        }
        else{
            scanf("%d",&a);
            find(a);
            printf("%d\n",ran[a]);
        }
    }
}
算法竞赛入门课习题 文章被收录于专栏

0

全部评论

相关推荐

双非阴暗爬行:我来看看笑死我了,这名字取得好想笑(没有不好的意思)
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务