From 1368a272d3ee2f9d5788ec36c0c93f2334efd412 Mon Sep 17 00:00:00 2001 From: Madhav Date: Sat, 29 Jul 2017 10:55:00 +0530 Subject: [PATCH] Kruskal's Algorithm --- Graph/Kruskal.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 Graph/Kruskal.cpp diff --git a/Graph/Kruskal.cpp b/Graph/Kruskal.cpp new file mode 100644 index 000000000..df83afc08 --- /dev/null +++ b/Graph/Kruskal.cpp @@ -0,0 +1,92 @@ +#include "bits/stdc++.h" +//#include +//using namespace boost::multiprecision; +const int mx = 1e6+5; +const long int inf = 2e9; +typedef long long ll; +#define rep(i,n) for(i=0;i +#define vpii vector< pii > +#define vi vector +#define vll vector +#define r(x) scanf("%d",&x) +#define rs(s) scanf("%s",s) +#define gc getchar_unlocked +#define pc putchar_unlocked +#define mp make_pair +#define pb push_back +#define lb lower_bound +#define ub upper_bound +#define endl "\n" +#define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); +using namespace std; +void in(int &x) +{ + register int c = gc(); x = 0; int neg = 0; + for(;((c<48 || c>57) && c != '-');c = gc());if(c=='-') {neg=1;c=gc();} for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;} + if(neg) x=-x; +} +void out (int n) { int N = n, rev, count = 0;rev = N; if (N == 0) { pc('0'); return ;} while ((rev % 10) == 0) { count++; rev /= 10;} rev = 0;while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;}while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;} +while (count--) pc('0'); +} +ll parent[mx],arr[mx],node,edge; +vector>>v; +void initial() +{ + int i; + rep(i,node+edge) + parent[i] = i; +} +int root(int i) +{ + while(parent[i] != i) + { + parent[i] = parent[parent[i]]; + i = parent[i]; + } + return i; +} +void join(int x,int y) +{ + int root_x = root(x); //Disjoint set union by rank + int root_y = root(y); + parent[root_x] = root_y; +} +ll kruskal() +{ + ll mincost=0,i,x,y; + rep(i,edge) + { + x = v[i].second.first; + y = v[i].second.second; + if(root(x) != root(y)) + { + mincost += v[i].first; + join(x,y); + } + } + return mincost; +} +int main(){ + fast; + while(1) + { + int i,j,from,to,cost,totalcost=0; + cin>>node>>edge; //Enter the nodes and edges + if(node==0 && edge==0) break; //Enter 0 0 to break out + initial(); //Initialise the parent array + rep(i,edge) + { + cin>>from>>to>>cost; + v.pb(mp(cost,mp(from,to))); + totalcost += cost; + } + sort(v.begin(),v.end()); + // rep(i,v.size()) + // cout<