forked from FahimaNoor/MinimumSpanningTree
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkruskal.cpp
141 lines (111 loc) · 2.97 KB
/
kruskal.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "kruskal.h"
#include "showedge.h"
#include "kruskalEdge.h"
#include <bits/stdc++.h>
//this file handles Kruskal Algorithm
//code concept taken from https://www.geeksforgeeks.org/kruskals-minimum-spanning-tree-algorithm-greedy-algo-2/
class Edge
{
public:
int src, dest, weight;
};
class Graph
{
public:
// V-> Number of vertices, E-> Number of edges
int V, E;
Edge* edge;
};
Graph* kruskal_graph;
int e;
Graph* createGraph(int V, int E)
{
Graph* graph = new Graph;
graph->V = V;
graph->E = E;
graph->edge = new Edge[E];
return graph;
}
class subset
{
public:
int parent;
int rank;
};
int find(subset subsets[], int i)
{
// find root and make root as parent of i
// (path compression)
if (subsets[i].parent != i)
subsets[i].parent = find(subsets, subsets[i].parent);
return subsets[i].parent;
}
void Union(subset subsets[], int x, int y)
{
int xroot = find(subsets, x);
int yroot = find(subsets, y);
// Attach smaller rank tree under root of high
// rank tree (Union by Rank)
if (subsets[xroot].rank < subsets[yroot].rank)
subsets[xroot].parent = yroot;
else if (subsets[xroot].rank > subsets[yroot].rank)
subsets[yroot].parent = xroot;
// If ranks are same, then make one as root and
// increment its rank by one
else
{
subsets[yroot].parent = xroot;
subsets[xroot].rank++;
}
}
int myComp(const void* a, const void* b)
{
Edge* a1 = (Edge*)a;
Edge* b1 = (Edge*)b;
return a1->weight > b1->weight;
}
int sum=0;
Edge result[20];
// THis will store the resultant MST
void KruskalMST(Graph* graph)
{
int V = graph->V;
e = 0; // An index variable, used for result[]
int i = 0;
qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp);
subset *subsets = new subset[( V * sizeof(subset) )];
for (int v = 0; v < V; ++v)
{
subsets[v].parent = v;
subsets[v].rank = 0;
}
while (e < V - 1 && i < graph->E)
{
Edge next_edge = graph->edge[i++];
int x = find(subsets, next_edge.src);
int y = find(subsets, next_edge.dest);
if (x != y)
{
result[e++] = next_edge;
Union(subsets, x, y);
}
}
}
void Kruskal:: createGraphs(int V,int E){
kruskal_graph = createGraph(V, E);
}
void Kruskal::updateGraph(int source,int dest, int weight){
kruskal_graph->edge[edge_counter].src = source;
kruskal_graph->edge[edge_counter].dest = dest;
kruskal_graph->edge[edge_counter].weight = weight;
edge_counter++;
}
void Kruskal::kruskalGraph(kruskalEdge kedge[20]){
KruskalMST(kruskal_graph);
//graph_weight=sum;
for(int i = 0; i<e ; i++){
kedge[i].src=result[i].src;
kedge[i].dest=result[i].dest;
kedge[i].weight=result[i].weight;
}
}