C ++程序实现不连续集数据结构
不相交集基本上是一组集合,其中不能有一个以上的项目。它支持对子集的联合和查找操作。
Find():用于查找特定元素位于哪个子集中并返回该特定集合的代表。
Union():它将两个不同的子集合并为一个子集,并且代表一组的代表另一组。
函数和伪代码
BeginAssume 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 3Yes
No
以上是 C ++程序实现不连续集数据结构 的全部内容, 来源链接: utcz.com/z/316405.html