From b3bbb77bf83e4345354587d770e0eb58f0486a33 Mon Sep 17 00:00:00 2001
From: Bruno Freitas Tissei <bft15@inf.ufpr.br>
Date: Sat, 3 Feb 2018 12:20:21 -0200
Subject: [PATCH] Add kruskal

Signed-off-by: Bruno Freitas Tissei <bft15@inf.ufpr.br>
---
 graph/kruskal.cpp          | 39 ++++++++++++++++++++++++++++++++++++++
 structure/disjoint_set.cpp | 14 +++++++-------
 2 files changed, 46 insertions(+), 7 deletions(-)
 create mode 100644 graph/kruskal.cpp

diff --git a/graph/kruskal.cpp b/graph/kruskal.cpp
new file mode 100644
index 0000000..ca5dd37
--- /dev/null
+++ b/graph/kruskal.cpp
@@ -0,0 +1,39 @@
+/**
+ * Kruskal
+ *
+ * Complexity (Time): O (m log n) 
+ * Complexity (Space): O(m)
+ * 
+ * #include <structure/disjoint_set>
+ *
+ * OBS: * = return maximum spanning tree
+ */
+
+vector<iii> mst;
+vector<iii> edges;
+
+bool cmp(iii a, iii b) { 
+  return a.se < b.se;
+  //* return a.se > b.se
+}
+
+int kruskal() {
+  sort(edges.begin(), edges.end(), cmp);
+
+  int size = 0;
+  for (int i = 0; i < MAX; i++)
+    make_set(i);
+
+  for (int i = 0; i < edges.size(); i++) {
+    int pu = find_set(edges[i].fi.fi);
+    int pv = find_set(edges[i].fi.se);
+
+    if (pu != pv) {
+      mst.pb(edges[i]);
+      size += edges[i].se;
+      union_set(pu, pv);
+    }
+  }
+
+  return size;
+}
diff --git a/structure/disjoint_set.cpp b/structure/disjoint_set.cpp
index 2f5af9e..37f3ff6 100644
--- a/structure/disjoint_set.cpp
+++ b/structure/disjoint_set.cpp
@@ -2,8 +2,8 @@
  * Disjoint-set
  *
  * Complexity (Time): O(1)
- *   makeset   -> O(1)
- *   find      -> O(a(n))
+ *   make_set  -> O(1)
+ *   find_set  -> O(a(n))
  *   union_set -> O(a(n))
  * Complexity (Space): O(n)
  */
@@ -13,24 +13,24 @@ int rank[MAX];
 int sz[MAX];
 
 // Initialize element x
-void makeset(int x) {
+void make_set(int x) {
   par[x] = x;
   rank[x] = 0;
   sz[x] = 1;
 }
 
 // Return set index from element x
-int find(int x) {
+int find_set(int x) {
   if (par[x] != x)
-    par[x] = find(par[x]);
+    par[x] = find_set(par[x]);
 
   return par[x];
 }
 
 // Make x and y belong to the same set
 void union_set(int x, int y) {
-  int xroot = find(x);
-  int yroot = find(y);
+  int xroot = find_set(x);
+  int yroot = find_set(y);
 
   if (xroot == yroot)
     return;
-- 
GitLab