zoukankan      html  css  js  c++  java
  • [经典算法]并查集

    概述:

    并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等。

    使用并查集时,首先会存在一组不相交的动态集合 S={S1,S2,⋯,Sk},一般都会使用一个整数表示集合中的一个元素。

    每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表。每个集合中具体包含了哪些元素是不关心的,具体选择哪个元素作为代表一般也是不关心的。我们关心的是,对于给定的元素,可以很快的找到这个元素所在的集合(的代表),以及合并两个元素所在的集合,而且这些操作的时间复杂度都是常数级的。

    程序代码:

    #include <gtest/gtest.h>
    #include <vector>
    
    using namespace std;
    
    class UnionFindSet
    {
    public:
        void MakeSet(int max)
        {
            m_vecId.assign(max,0);
            for (int i=0; i<max; i++)
            {
                m_vecId[i] = i;
            }
    
            m_nSetsCount = max;
        }
    
        int Find(int x)
        {
            return m_vecId[x];
        }
    
        void UnionSet(int x, int y)
        {
            int xId = Find(x);
            int yId = Find(y);
    
            if (xId == yId)
            {
                return;
            }
    
            for (unsigned int i=0; i<m_vecId.size(); ++i)
            {
                if (m_vecId[i] == xId)
                {
                    m_vecId[i] = yId;
                }
            }
    
            --m_nSetsCount;
        }
    
        int Count()
        {
            return m_nSetsCount;
        }
    
        bool SameSet(int x, int y)
        {
            return (Find(x) == Find(y));
        }
    
    private:
    
        vector<int> m_vecId;
        int m_nSetsCount;
    };
    
    TEST(Algo, tUnionFindSet)
    {
        // 测试集合,按照字母大小写来区分
        char SetData[] = {'A','b','C','E','d','e','F'};
    
        UnionFindSet uf;
        uf.MakeSet(7);
    
        uf.UnionSet(0,2); // A C
        uf.UnionSet(2,3); // C E
        uf.UnionSet(3,6); // E F
    
        uf.UnionSet(1,4); // b d
        uf.UnionSet(4,5); // d e
    
        ASSERT_TRUE(uf.SameSet(0,3));
        ASSERT_TRUE(uf.SameSet(6,2));
        ASSERT_TRUE(uf.SameSet(1,5));
    
        ASSERT_FALSE(uf.SameSet(0,5));
        ASSERT_FALSE(uf.SameSet(2,1));
        ASSERT_FALSE(uf.SameSet(6,4));
    }

    参考引用:

    http://www.cnblogs.com/cyjb/p/UnionFindSets.html

  • 相关阅读:
    sabaki and leelazero
    apply current folder view to all folders
    string operation in powershell
    wirte function in powershell
    add environment path to powershell
    Module in powershell
    sql prompt
    vmware中鼠标在部分区域不能使用
    调整多个控件的dock的顺序
    行为型模型 策略模式
  • 原文地址:https://www.cnblogs.com/Quincy/p/5205155.html
Copyright © 2011-2022 走看看