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