Skip to content

Commit 1bdd970

Browse files
committed
mst algorithms
1 parent b30cedb commit 1bdd970

3 files changed

+153
-0
lines changed

chapter09/05-MinimumSpanningTree.js

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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+
}
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script src="05-MinimumSpanningTree.js"></script>
9+
<script src="06-UsingMinimumSpanningTree.js"></script>
10+
</body>
11+
</html>
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var i;
2+
3+
var graph = [[0, 2, 4, 0, 0, 0],
4+
[2, 0, 2, 4, 2, 0],
5+
[4, 2, 0, 0, 3, 0],
6+
[0, 4, 0, 0, 3, 2],
7+
[0, 2, 3, 3, 0, 2],
8+
[0, 0, 0, 2, 2, 0]];
9+
10+
var mst = new MinimumSpanningTree(graph);
11+
12+
13+
console.log("********* Prim's Algorithm - Minimum Spanning Tree ***********");
14+
15+
var parent = mst.prim();
16+
17+
console.log('Edge Weight');
18+
for (i = 1; i < graph.length; i++){
19+
console.log(parent[i] + ' - ' + i + ' ' + graph[i][parent[i]]);
20+
}
21+
22+
console.log("********* Kruskal Algorithm - Minimum Spanning Tree ***********");
23+
24+
parent = mst.kruskal();
25+
26+
console.log('Edge Weight');
27+
for (i = 1; i < graph.length; i++){
28+
console.log(parent[i] + ' - ' + i + ' ' + graph[i][parent[i]]);
29+
}

0 commit comments

Comments
 (0)