文章

39

粉丝

74

获赞

1

访问

18.5k

头像
调查作弊 题解:并查集
P1759 杭州电子科技大学机试题
发布于2024年3月15日 16:00
阅读数 410

#include <stdio.h>
#include <stdlib.h>

int xiangsi[10000000];
int chaoxi[10000000];
int tuanhuo[10000000];
int n,m;

int find1(int x){
    if(x!=xiangsi[x])xiangsi[x]=find1(xiangsi[x]);
    return xiangsi[x];
}

int find2(int x){
    if(x!=chaoxi[x])chaoxi[x]=find2(chaoxi[x]);
    return chaoxi[x];
}




int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        xiangsi[i]=i;
        chaoxi[i]=i;
        tuanhuo[i]=0;
    }

    int a,b;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        if(find1(a)!=find1(b)){
            xiangsi[find1(a)]=find1(b);//挂到一个集合下
        }else{
            chaoxi[find2(a)]=find2(b);
        }
    }
    //统计抄袭人数
    for(int i=1;i<=n;i++){
        tuanhuo[find2(i)]++;
    }
    int cout=0;
    for(int i=1;i<=n;i++){
        if(tuanhuo[i]>=2)cout++;
    }
    printf("%d\n",cout);

    return 0;
}

借鉴了另一个题解,不过写的稍微简洁,仅供参考

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发