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