forked from amanss00/ForNewbies
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkruskals_Algo.cpp
More file actions
90 lines (74 loc) · 1.65 KB
/
kruskals_Algo.cpp
File metadata and controls
90 lines (74 loc) · 1.65 KB
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
// To find minimum spanning tree
#include <bits/stdc++.h>
using namespace std;
class Edge
{
public:
int source;
int destination;
int weight;
};
bool campare(Edge e1, Edge e2)
{
return e1.weight < e2.weight;
}
int findParent(int v, int *parent)
{
if (parent[v] == v)
{
return v;
}
return findParent(parent[v], parent);
}
void kruskals(Edge *input, int n, int e)
{
sort(input, input + e, campare);
Edge *output = new Edge[n - 1];
int *parent = new int[n];
for (int i = 0; i < n; i++)
{
parent[i] = i;
}
int count = 0;
int i = 0;
while (count != n - 1)
{
Edge currentEdge = input[i];
int sourceParent = findParent(currentEdge.source, parent);
int destParent = findParent(currentEdge.destination, parent);
if (sourceParent != destParent)
{
output[count] = currentEdge;
count++;
parent[sourceParent] = destParent;
}
i++;
}
for (int i = 0; i < n - 1; i++)
{
if (output[i].source < output[i].destination)
{
cout << output[i].source << " " << output[i].destination << " " << output[i].weight << endl;
}
else
{
cout << output[i].destination << " " << output[i].source << " " << output[i].weight << endl;
}
}
}
int main()
{
int n, e;
cin >> n >> e;
Edge *input = new Edge[e];
for (int i = 0; i < e; i++)
{
int s, d, w;
cin >> s >> d >> w;
input[i].source = s;
input[i].destination = d;
input[i].weight = w;
}
kruskals(input, n, e);
return 0;
}