Skip to content

Commit bf4040a

Browse files
authored
Merge pull request deutranium#248 from keshav2712/master
Added Kruskals Algorithm in C
2 parents ee96d3f + cd39379 commit bf4040a

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <assert.h>
4+
5+
#define N 1000005
6+
#define I 10000000005
7+
8+
typedef long long int ll;
9+
typedef struct Node
10+
{
11+
ll cost;
12+
ll vertex1;
13+
ll vertex2;
14+
} Node;
15+
int comparator(const void *a, const void *b)
16+
{
17+
return ((*(Node *)a).cost - (*(Node *)b).cost);
18+
}
19+
ll parent(ll set[], ll i)
20+
{
21+
if (set[i] == i)
22+
return i;
23+
else
24+
{
25+
set[i] = parent(set, set[i]);
26+
return set[i];
27+
}
28+
}
29+
void setUnion(ll set[], ll a, ll b)
30+
{
31+
a = parent(set, a);
32+
b = parent(set, b);
33+
if (a != b)
34+
set[b] = a;
35+
}
36+
void initSet(ll set[], ll v)
37+
{
38+
for (ll i = 0; i < v; i++)
39+
set[i] = i;
40+
}
41+
long long int kruskals(Node m[], ll e, ll n)
42+
{
43+
long long int sum = 0;
44+
ll set[N];
45+
initSet(set, n);
46+
ll j = 0;
47+
ll counter = 0;
48+
qsort(m, e, sizeof(Node), comparator);
49+
while ((j < n - 1) && (counter < e))
50+
{
51+
ll x = m[counter].vertex1, y = m[counter].vertex2;
52+
53+
if ((parent(set, x) != parent(set, y)) && (counter < e))
54+
{
55+
sum += m[counter].cost;
56+
setUnion(set, x, y);
57+
j++;
58+
}
59+
counter++;
60+
}
61+
return sum;
62+
}
63+
int main()
64+
{
65+
ll n = 0, X = 0;
66+
scanf("%lld %lld", &n, &X);
67+
Node edges[N];
68+
assert(edges);
69+
for (ll i = 0; i < X; i++)
70+
{
71+
scanf("%lld %lld %lld", &edges[i].vertex1, &edges[i].vertex2, &edges[i].cost);
72+
}
73+
printf("%lld\n", kruskals(edges, X, n));
74+
return 0;
75+
}

0 commit comments

Comments
 (0)