美文网首页
并查集学习记录

并查集学习记录

作者: Fgban | 来源:发表于2019-10-16 16:59 被阅读0次

    借助于oj的题目对并查集的进行学习,同时利用c语言将题目进行了实现。
    并查集原理介绍
    实现题目来源:1.朋友圈问题(本文)
    2.畅通工程(杭电oj题目)


    C语言实现代码

    #include<stdio.h>
    #include<string.h>
    
    int pre[40000];
    int n, m;
    int a, b;
    int num[40000];
     
    //每个点初始化为只含有自己的集合 
    void init(){
        int i;
        for(i = 1; i <= n; i++)
            pre[i] = i;
    }
    //寻找元素x所在集合的代表元素 
    int find(int x){
        //如果x等于了pre[x]的值(即初始化的值)则pre[x]为x的代表元素 
        if(x == pre[x])
            return x;
        //若未不是,则继续向上搜索,找到代表元素,同时将x指向它 
        else
            return pre[x] = find(pre[x]);
    }
    //集合合并操作,将一个集合的代表元素指向另一个集合的代表元素 
    void merge(int x, int y){
        //找到x和y所在集合的代表元素 
        int fx = find(x);
        int fy = find(y);
        //将fx指向fy 
        if(fx != fy)
            pre[fx] = fy;
    }
    
    int main(){
        int i;
        while(scanf("%d%d", &n, &m) != EOF){
            init();
            while(m--){
                int k;
                scanf("%d", &k);
                scanf("%d", &a);
                k--;
                while(k--){
                    scanf("%d", &b);
                    merge(a, b);
                }
            }
            memset(num, 0, sizeof(num));
            for(i = 1; i <= n; i++){
                num[find(i)]++;
            }
            int ans = 0;
            for(i = 1; i <= n; i++){
                if(num[i] > ans)
                   ans = num[i];
            }
            printf("%d\n",ans);
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:并查集学习记录

          本文链接:https://www.haomeiwen.com/subject/azyumctx.html