Skip to content

Commit 80b215c

Browse files
committed
feat: Add Kruskal's Algorithm for Minimum Spanning Tree
- Implements Kruskal's algorithm using Union-Find - Includes comprehensive unit tests - Time complexity: O(E log E) - Space complexity: O(V + E) Fixes #7067
1 parent f693c44 commit 80b215c

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package com.thealgorithms.graphs;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
7+
import com.thealgorithms.graphs.Kruskal.Edge;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
import org.junit.jupiter.api.Test;
11+
12+
/**
13+
* Test cases for Kruskal's Algorithm
14+
*
15+
* @author Raghu0703
16+
*/
17+
class KruskalTest {
18+
19+
@Test
20+
void testSimpleGraph() {
21+
// Graph with 4 vertices
22+
int vertices = 4;
23+
List<Edge> edges = new ArrayList<>();
24+
edges.add(new Edge(0, 1, 10));
25+
edges.add(new Edge(0, 2, 6));
26+
edges.add(new Edge(0, 3, 5));
27+
edges.add(new Edge(1, 3, 15));
28+
edges.add(new Edge(2, 3, 4));
29+
30+
List<Edge> mst = Kruskal.kruskalMST(vertices, edges);
31+
32+
// MST should have exactly 3 edges (V-1)
33+
assertEquals(3, mst.size());
34+
35+
// Total weight should be 19 (4 + 5 + 10)
36+
assertEquals(19, Kruskal.getMSTWeight(mst));
37+
}
38+
39+
@Test
40+
void testDisconnectedComponents() {
41+
// Graph with 5 vertices but only 3 can be connected
42+
int vertices = 5;
43+
List<Edge> edges = new ArrayList<>();
44+
edges.add(new Edge(0, 1, 1));
45+
edges.add(new Edge(1, 2, 2));
46+
edges.add(new Edge(3, 4, 3));
47+
48+
List<Edge> mst = Kruskal.kruskalMST(vertices, edges);
49+
50+
// MST should have 3 edges (not complete spanning tree due to disconnection)
51+
assertEquals(3, mst.size());
52+
assertEquals(6, Kruskal.getMSTWeight(mst));
53+
}
54+
55+
@Test
56+
void testSingleEdge() {
57+
int vertices = 2;
58+
List<Edge> edges = new ArrayList<>();
59+
edges.add(new Edge(0, 1, 5));
60+
61+
List<Edge> mst = Kruskal.kruskalMST(vertices, edges);
62+
63+
assertEquals(1, mst.size());
64+
assertEquals(5, Kruskal.getMSTWeight(mst));
65+
}
66+
67+
@Test
68+
void testCompleteGraph() {
69+
// Complete graph with 4 vertices
70+
int vertices = 4;
71+
List<Edge> edges = new ArrayList<>();
72+
edges.add(new Edge(0, 1, 1));
73+
edges.add(new Edge(0, 2, 4));
74+
edges.add(new Edge(0, 3, 3));
75+
edges.add(new Edge(1, 2, 2));
76+
edges.add(new Edge(1, 3, 5));
77+
edges.add(new Edge(2, 3, 6));
78+
79+
List<Edge> mst = Kruskal.kruskalMST(vertices, edges);
80+
81+
// MST should have 3 edges
82+
assertEquals(3, mst.size());
83+
84+
// Total weight should be 6 (1 + 2 + 3)
85+
assertEquals(6, Kruskal.getMSTWeight(mst));
86+
}
87+
88+
@Test
89+
void testGraphWithEqualWeights() {
90+
int vertices = 3;
91+
List<Edge> edges = new ArrayList<>();
92+
edges.add(new Edge(0, 1, 5));
93+
edges.add(new Edge(1, 2, 5));
94+
edges.add(new Edge(0, 2, 5));
95+
96+
List<Edge> mst = Kruskal.kruskalMST(vertices, edges);
97+
98+
assertEquals(2, mst.size());
99+
assertEquals(10, Kruskal.getMSTWeight(mst));
100+
}
101+
102+
@Test
103+
void testEmptyGraph() {
104+
int vertices = 3;
105+
List<Edge> edges = new ArrayList<>();
106+
107+
List<Edge> mst = Kruskal.kruskalMST(vertices, edges);
108+
109+
assertTrue(mst.isEmpty());
110+
}
111+
112+
@Test
113+
void testInvalidVertexCount() {
114+
List<Edge> edges = new ArrayList<>();
115+
edges.add(new Edge(0, 1, 10));
116+
117+
assertThrows(IllegalArgumentException.class, () -> {
118+
Kruskal.kruskalMST(0, edges);
119+
});
120+
121+
assertThrows(IllegalArgumentException.class, () -> {
122+
Kruskal.kruskalMST(-5, edges);
123+
});
124+
}
125+
126+
@Test
127+
void testNullEdges() {
128+
assertThrows(IllegalArgumentException.class, () -> {
129+
Kruskal.kruskalMST(5, null);
130+
});
131+
}
132+
133+
@Test
134+
void testLargerGraph() {
135+
// Graph with 6 vertices
136+
int vertices = 6;
137+
List<Edge> edges = new ArrayList<>();
138+
edges.add(new Edge(0, 1, 4));
139+
edges.add(new Edge(0, 2, 4));
140+
edges.add(new Edge(1, 2, 2));
141+
edges.add(new Edge(1, 3, 5));
142+
edges.add(new Edge(2, 3, 8));
143+
edges.add(new Edge(2, 4, 10));
144+
edges.add(new Edge(3, 4, 2));
145+
edges.add(new Edge(3, 5, 6));
146+
edges.add(new Edge(4, 5, 3));
147+
148+
List<Edge> mst = Kruskal.kruskalMST(vertices, edges);
149+
150+
// MST should have 5 edges (6-1)
151+
assertEquals(5, mst.size());
152+
153+
// Verify minimum total weight
154+
assertEquals(16, Kruskal.getMSTWeight(mst));
155+
}
156+
}

0 commit comments

Comments
 (0)