-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathKruskal's algorithm.cpp
141 lines (105 loc) · 3.2 KB
/
Kruskal's algorithm.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
/*
Kruskal's Algorithm
Given an undirected, connected and weighted graph G(V, E) with V number of vertices (which are numbered from 0 to V-1) and E number of edges.
Find and print the Minimum Spanning Tree (MST) using Kruskal's algorithm.
For printing MST follow the steps -
1. In one line, print an edge which is part of MST in the format -
v1 v2 w
where, v1 and v2 are the vertices of the edge which is included in MST and whose weight is w. And v1 <= v2 i.e. print the smaller vertex first
while printing an edge.
2. Print V-1 edges in above format in different lines.
Note : Order of different edges doesn't matter.
Input Format :
Line 1: Two Integers V and E (separated by space)
Next E lines : Three integers ei, ej and wi, denoting that there exists an edge between vertex ei and vertex ej with weight wi (separated by space)
Output Format :
Print the MST, as described in the task.
Constraints :
2 <= V, E <= 10^5
Time Limit: 1 sec
Sample Input 1 :
4 4
0 1 3
0 3 5
1 2 1
2 3 8
Sample Output 1 :
1 2 1
0 1 3
0 3 5
*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Edge {
public:
int source;
int destination;
int weight;
Edge(int source, int destination, int weight) {
this -> source = source;
this -> destination = destination;
this -> weight = weight;
}
};
bool sortByWeight(Edge const &a, Edge const &b) {
return a.weight < b.weight;
}
// Union Find
int getParent(vector<int>& parent, int vertex) {
// base case
if(parent[vertex] == vertex) {
return vertex;
}
return getParent(parent, parent[vertex]);
}
vector<Edge> kruskalMST(vector<Edge>& graph, vector<int> &parent) {
int v = parent.size();
int count = 0;
int index = 0;
vector<Edge> answer;
while(count != v - 1) {
Edge currentEdge = graph[index];
// Using Unio Find algorithm -> O(EV) Time
int parentOfSource = getParent(parent, currentEdge.source);
int parentOfDestination = getParent(parent, currentEdge.destination);
if(parentOfSource != parentOfDestination) {
answer.push_back(currentEdge);
count++;
parent[parentOfDestination] = parentOfSource;
}
index++;
}
return answer;
}
int main() {
// Write your code here
int v, e;
cin >> v >> e;
vector<Edge> graph;
for(int i = 0; i < e; i++) {
int source;
int destination;
int weight;
cin >> source >> destination >> weight;
Edge edge(source, destination, weight);
graph.push_back(edge);
}
sort(graph.begin(), graph.end(), sortByWeight);
vector<int> parent(v);
for(int i = 0; i < v; i++) {
parent[i] = i;
}
vector<Edge> MST = kruskalMST(graph, parent);
for(auto it : MST) {
if(it.source < it.destination) {
cout << it.source << " " << it.destination << " " << it.weight;
} else {
cout << it.destination << " " << it.source << " " << it.weight;
}
cout << endl;
}
}
// Time Complexity : O(ElogE + EV)
// Auxilalry Space : O(V + E)