From 4f9bec08ae243e95ef629afa18c45f56f78c5946 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Date: Wed, 9 Oct 2019 00:55:20 +0530 Subject: [PATCH] disjoint_sets.cpp: Added Disjoint sets data structure A disjoint-set data structure is a data structure that keeps track of a set of elements partitioned into a number of disjoint (non-overlapping) subsets. A union-find algorithm is an algorithm that performs two useful operations on such a data structure: Find: Determine which subset a particular element is in. This can be used for determining if two elements are in the same subset. Union: Join two subsets into a single subset. --- Data Structures/disjoint_sets.cpp | 80 +++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 Data Structures/disjoint_sets.cpp diff --git a/Data Structures/disjoint_sets.cpp b/Data Structures/disjoint_sets.cpp new file mode 100644 index 000000000..9f56b364a --- /dev/null +++ b/Data Structures/disjoint_sets.cpp @@ -0,0 +1,80 @@ +#include +using namespace std; + +class disjoint_set +{ + public: + vector ds; + disjoint_set(int n) + { + ds.resize(n + 1); + for(int i = 1; i <= n; i++) + { + make_set(i); + } + } + void make_set(int node); + int find_set(int node); + void union_sets(int node_a, int node_b); + void print_disjoint_sets(); +}; + +void disjoint_set::make_set(int node) +{ + ds[node] = node; +} + +int disjoint_set::find_set(int node) +{ + if(ds[node] == node) + return node; + else + return ds[node] = find_set(ds[node]); +} + +void disjoint_set::union_sets(int node_a, int node_b) +{ + ds[node_a] = node_b; +} + +void disjoint_set::print_disjoint_sets() +{ + map> disjoint_sets; + for(int i = 1; i <= ds.size(); i++) + { + disjoint_sets[find_set(ds[i])].push_back(i); + } + cout << "Disjoint sets are following:\n"; + int set_number = 1; + for(auto it : disjoint_sets) + { + cout << "Set " << set_number++ << ": "; + for(auto jt : it.second) + { + cout << jt << " "; + } + cout << "\n"; + } +} + +int main() +{ + int nodes; + cin >> nodes; + disjoint_set dsu(nodes); + int edges; + cin >> edges; + for(int i = 0; i < edges; i++) + { + int u,v; + cin >> u >> v; + int parent_u = dsu.find_set(u); + int parent_v = dsu.find_set(v); + if(parent_u != parent_v) + { + dsu.union_sets(parent_u, parent_v); + } + } + dsu.print_disjoint_sets(); + return 0; +}