并查集小题目

该博客主要介绍了如何通过并查集(Disjoint Set)数据结构解决微信朋友圈扩大版的问题。给定用户数量N和直接好友关系M,程序通过查找根节点和合并集合的方法,计算出总共形成的扩大版朋友圈数量。程序实现了快速查找和路径压缩等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

微信朋友圈出了扩大版。其中好友分为直接好友和间接好友。和你有直接好友关系的是你的直接好友,你的直接好友的好友都是你的间接好友。所有互为好友的人共同构成了一个朋友圈,圆里每个人都其他人的直接成间接的好友。
已知微信用户共有N位,以及他们之间的直接好友关系,请你找出总共形成了多少个扩大版朋友圈。
输入格式
第一行输入两个整数N(K<=NK=IDDD),MO<=M<IDDD),分别表示微信用户的人数、他们之间的直接好友关系的数目。
接下来有M行输入,每行输入两个整数xK=X<=N)、y(<=y<=N),表示用户X和用户y是直接好友。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STU 10000
char g[MAX_STU][MAX_STU];
int father[MAX_STU];
//查找当前元素所在树的根节点(代表元素)
int find(int x){
    if(x == father[x])
        return x;
    return find(father[x]);
}
//合并元素x, y所处的集合
void Unite(int x, int y){ //查找到x,y的根节点
    x = find(x);
    y = find(y);
    if(x == y)
    return ;
    //将x的根节点与y的根节点相连
    father[x] = y;
}
int main()
{
    memset(g,0,sizeof(g));

    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=0;i<=n;i++){
        father[i]=i;
    }
    int a1,a2;
    for(int i=0;i<m;i++){
        scanf("%d %d",&a1,&a2);
        if(a1>a2){
            int tmp=a1;
            a2=a1;a1=tmp;
        }
        father[a2]=a1;
    }
    for(int i=1;i<=n;i++){
        int f=find(i);
        father[i]=f;
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        if(father[i]==i) ans++;
    }
    printf("%d\r\n",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清欢_小铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值