2020/4/11_网易笔试题_操作集合(并查集删点)


哎 实在是太菜了 之后我会补上新解法的

  • 并查集基础题,增加一维belong数组表示该点属于哪个集合即可
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 1e3 + 10;

int N,M,S;
int fa[maxn],num[maxn],belong[maxn];
void init(){
    for(int i = 1 ; i <= N; i ++){
        belong[i] = fa[i] = i;
        num[i] = 1;
    } 
}
int finds(int x){return fa[x] != x ? fa[x] = finds(x) : x;}

void Union(int a,int b){
    a = finds(a), b = finds(b);
    if(a == b) return;
    num[a] += num[b];
    fa[b] = a;
}

int main(){
    int T; 
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&N,&M); init();
        int cnt = N;
        for(int i = 1; i <= M ; i ++){
            int op; scanf("%d",&op);
            if(op == 1){
                int x,y; scanf("%d%d",&x,&y);
                Union(belong[x],belong[y]);    
            }else if(op == 2){
                int x; scanf("%d",&x);
                num[finds(belong[x])]--;
                belong[x] = ++cnt;
                fa[cnt] = cnt; num[cnt] = 1;
            }else{
                int x; scanf("%d",&x);
                printf("%d\n",num[finds(belong[x])]);
            }
        }
    }
    return 0;
}
全部评论

相关推荐

头像 会员标识
11-27 17:08
已编辑
牛客_产品运营部_私域运营
腾讯 普通offer 24k~26k * 15,年包在36w~39w左右。
点赞 评论 收藏
分享
10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
10-30 10:16
南京大学 Java
龚至诚:给南大✌️跪了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务