1
+ function MinimumSpanningTree ( graph ) {
2
+
3
+ this . graph = graph ;
4
+
5
+ var INF = Number . MAX_SAFE_INTEGER ;
6
+
7
+ var minKey = function ( key , visited ) {
8
+ // Initialize min value
9
+ var min = INF , minIndex ;
10
+
11
+ for ( var v = 0 ; v < this . graph . length ; v ++ ) {
12
+ if ( visited [ v ] == false && key [ v ] < min ) {
13
+ min = key [ v ] ;
14
+ minIndex = v ;
15
+ }
16
+ }
17
+
18
+ return minIndex ;
19
+ } ;
20
+
21
+ this . prim = function ( ) {
22
+ var parent = [ ] ,
23
+ key = [ ] ,
24
+ visited = [ ] ,
25
+ length = this . graph . length ,
26
+ i ;
27
+
28
+ for ( i = 0 ; i < length ; i ++ ) {
29
+ key [ i ] = INF ;
30
+ visited [ i ] = false ;
31
+ }
32
+
33
+ key [ 0 ] = 0 ;
34
+ parent [ 0 ] = - 1 ;
35
+
36
+ for ( i = 0 ; i < length - 1 ; i ++ ) {
37
+ var u = minKey ( key , visited ) ;
38
+ visited [ u ] = true ;
39
+
40
+ for ( var v = 0 ; v < length ; v ++ ) {
41
+ if ( this . graph [ u ] [ v ] && visited [ v ] == false && this . graph [ u ] [ v ] < key [ v ] ) {
42
+ parent [ v ] = u ;
43
+ key [ v ] = this . graph [ u ] [ v ] ;
44
+ }
45
+ }
46
+ }
47
+
48
+ return parent ;
49
+ } ;
50
+
51
+ var find = function ( i , parent ) {
52
+ while ( parent [ i ] ) {
53
+ i = parent [ i ] ;
54
+ }
55
+ return i ;
56
+ } ;
57
+
58
+ var union = function ( i , j , parent ) {
59
+ if ( i != j ) {
60
+ parent [ j ] = i ;
61
+ return true ;
62
+ }
63
+ return false ;
64
+ } ;
65
+
66
+ var initializeCost = function ( ) {
67
+ var cost = [ ] , length = this . graph . length ;
68
+ for ( var i = 0 ; i < length ; i ++ ) {
69
+ cost [ i ] = [ ] ;
70
+ for ( var j = 0 ; j < length ; j ++ ) {
71
+ if ( this . graph [ i ] [ j ] == 0 ) {
72
+ cost [ i ] [ j ] = INF ;
73
+ } else {
74
+ cost [ i ] [ j ] = this . graph [ i ] [ j ] ;
75
+ }
76
+ }
77
+ }
78
+ return cost ;
79
+ } ;
80
+
81
+ this . kruskal = function ( ) {
82
+
83
+ var length = this . graph . length ,
84
+ parent = [ ] , cost ,
85
+ ne = 0 , a , b , u , v , i , j , min ;
86
+
87
+ cost = initializeCost ( ) ;
88
+
89
+ while ( ne < length - 1 ) {
90
+
91
+ for ( i = 0 , min = INF ; i < length ; i ++ ) {
92
+ for ( j = 0 ; j < length ; j ++ ) {
93
+ if ( cost [ i ] [ j ] < min ) {
94
+ min = cost [ i ] [ j ] ;
95
+ a = u = i ;
96
+ b = v = j ;
97
+ }
98
+ }
99
+ }
100
+
101
+ u = find ( u , parent ) ;
102
+ v = find ( v , parent ) ;
103
+
104
+ if ( union ( u , v , parent ) ) {
105
+ ne ++ ;
106
+ }
107
+
108
+ cost [ a ] [ b ] = cost [ b ] [ a ] = INF ;
109
+ }
110
+
111
+ return parent ;
112
+ }
113
+ }
0 commit comments