美文网首页
并查集 | find & union

并查集 | find & union

作者: zilla | 来源:发表于2019-08-02 23:19 被阅读0次

并查集 Disjoint Set

b站大佬的讲解视频
以下截屏来自⬆️讲解视频






应用

检查无向图中是否有环
Kruskal算法(最小生成树)

1107 Social Clusters (30 分)

⚠️ 每个集合的root可能还没有收敛到同一个。因此需要遍历,调用_find函数,找到唯一的root。isRoot也用作计数当前集合的所有成员数量。isRoot数组非零元素数量即disjoint集合数量。
⚠️ greater<>()需要 #include <functional>
⚠️ sort范围,输出范围!!!

#include <cstdio>
#include <algorithm>
#include <functional>

using namespace std;
int father[1010], hobby_root[1010], nn;
int isRoot[1010];

int _find(int curr) {
    return father[curr] < 0 ? curr : father[curr] = _find(father[curr]);
}

void _union(int a, int b) {
    a = _find(a);
    b = _find(b);
    if (a != b) {
        father[a] += father[b];
        father[b] = a;
    }
}

int main() {
    scanf("%d", &nn);
    fill(father, father + 1010, -1);
    fill(hobby_root, hobby_root + 1010, 0);
    fill(isRoot, isRoot + 1010, 0);
    for (int i = 1; i <= nn; ++i) {
        int cnt, hobby;
        scanf("%d:", &cnt);
        for (int j = 0; j < cnt; ++j) {
            scanf("%d", &hobby);
            if (hobby_root[hobby] == 0) { //is 0
                hobby_root[hobby] = i;
            } else {
                _union(hobby_root[hobby], i);
            }
        }
    }
    int size = 0;
    for (int i = 1; i <= nn; ++i) {
        isRoot[_find(i)]++;
    }
    for (int i = 1; i <= nn; ++i) {
        if (isRoot[i])
            size++;
    }
    sort(isRoot, isRoot + nn + 1, greater<>());
    printf("%d\n", size);
    for (int i = 0; i < size; ++i) {
        printf("%d", isRoot[i]);
        if (i + 1 < size) printf(" ");
    }
    /*
    sort(isRoot + 1, isRoot + nn + 1, greater<>());
    printf("%d\n", size);
    for (int i = 1; i <= size; ++i) {
        printf("%d", isRoot[i]);
        if (i < size) printf(" ");
    }
     */
    return 0;
}

相关文章

  • 从并查集Union Find算法谈算法解决实际问题的过程

    从并查集Union Find算法谈算法解决实际问题的过程算法并查集算法寻找路径 从并查集Union Find算法谈...

  • 神奇的数据结构---并查集

    并查集(Union Find)何为集,集合,用树表示;何为并,集合的合并(union);何为查,查询元素所属集合(...

  • [并查集]并查集的升级路线(四)

    路径压缩并查集 并查集在经过了quick-find、quick-union、加权quick-union的演化之后,...

  • 深入理解并查集

    并查集是一种树形结构,它是由并查集算法进行维护的。而并查集算法(Union-find-algorithm),顾名思...

  • union find 并查集

    一、数据的预处理 要找一个数是不是在数组中,不可能用遍历的方法实现,这样时间复杂度就超过O(n)了。而要降低时间复...

  • 并查集 | find & union

    并查集 Disjoint Setb站大佬的讲解视频以下截屏来自⬆️讲解视频 应用 检查无向图中是否有环 Krusk...

  • 并查集(Union Find)

    并查集也叫做不相交集合(Disjoint Set),这种数据结构主要用来快速的判断两个集合是否有交集的问题,或者说...

  • 并查集 Union Find

    什么是并查集 一种很不一样得到树形结构 连接问题image.png

  • 并查集--Union Find

    并查集的概念 一种可以用来判断相互关联(同属一个集合)的元素属于几个集合,也可以用来判断图结构中的两点是否是联通的...

  • 并查集Union Find

    对于并查集的理解? a.并查集用于处理连接问题,可以非常快地判断出网络中节点的连接状态.能够快速实现数学中的集合类...

网友评论

      本文标题:并查集 | find & union

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