C ++程序实现不连续集数据结构

不相交集基本上是一组集合,其中不能有一个以上的项目。它支持对子集的联合和查找操作。

Find():用于查找特定元素位于哪个子集中并返回该特定集合的代表。

Union():它将两个不同的子集合并为一个子集,并且代表一组的代表另一组。

函数和伪代码

Begin

   Assume k is the element

   makeset(k):

      k.parent = k.

   Find(x):

   If k.parent == k

      return k.

   else

   return Find(k.parent)

   Union (a,b):

      Take two set a and b as input.

      aroot = Find(a)

      broot = Find(b)

      aroot.parent = broot

End

示例

#include <iostream>

#include <vector>

#include <unordered_map>

using namespace std;

class DisjointSet { //to represent disjoint set

   unordered_map<int, int> parent;

   public:

   void makeSet(vector<int> const &wholeset){

   //执行makeset操作

      for (int i : wholeset) // create n disjoint sets

      (one for each item)

      parent[i] = i;

   }

   int Find(int l) { // Find the root of the set in which element l belongs

      if (parent[l] == l) // if l is root

         return l;

      return Find(parent[l]); // recurs for parent till we find root

   }

   void Union(int m, int n) { // perform Union of two subsets m and n  

      int x = Find(m);

      int y = Find(n);

      parent[x] = y;

   }

};

void print(vector<int> const &universe, DisjointSet &dis) {

   for (int i : universe)

   cout << dis.Find(i) << " ";

   cout << '\n';

}

int main() {

   vector<int> wholeset = { 6,7,1,2,3 }; // items of whole set

   DisjointSet dis; //initialize DisjointSet class

   dis.makeSet(wholeset); // create individual set of the items of wholeset

   dis.Union(7, 6); // 7,6 are in same set

   print(wholeset, dis);

   if (dis.Find(7) == dis.Find(6)) // if they are belong to same set or not.

      cout<<"Yes"<<endl;

   else

      cout<<"No";

   if (dis.Find(3) == dis.Find(4))

      cout<<"Yes"<<endl;

   else

      cout<<"No";

   return 0;

}

输出结果

6 6 1 2 3

Yes

No

以上是 C ++程序实现不连续集数据结构 的全部内容, 来源链接: utcz.com/z/316405.html

回到顶部