mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-07 09:45:04 +08:00
Enhance docs, remove main
, add tests in PrimMST
(#5969)
This commit is contained in:
@ -852,6 +852,7 @@
|
|||||||
* [KosarajuTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/KosarajuTest.java)
|
* [KosarajuTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/KosarajuTest.java)
|
||||||
* [KruskalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/KruskalTest.java)
|
* [KruskalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/KruskalTest.java)
|
||||||
* [MatrixGraphsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/MatrixGraphsTest.java)
|
* [MatrixGraphsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/MatrixGraphsTest.java)
|
||||||
|
* [PrimMSTTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/PrimMSTTest.java)
|
||||||
* [TarjansAlgorithmTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/TarjansAlgorithmTest.java)
|
* [TarjansAlgorithmTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/TarjansAlgorithmTest.java)
|
||||||
* [WelshPowellTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/WelshPowellTest.java)
|
* [WelshPowellTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/WelshPowellTest.java)
|
||||||
* hashmap
|
* hashmap
|
||||||
|
@ -1,19 +1,17 @@
|
|||||||
package com.thealgorithms.datastructures.graphs;
|
package com.thealgorithms.datastructures.graphs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Java program for Prim's Minimum Spanning Tree (MST) algorithm. adjacency
|
* A Java program for Prim's Minimum Spanning Tree (MST) algorithm.
|
||||||
* matrix representation of the graph
|
* Adjacency matrix representation of the graph.
|
||||||
*/
|
*/
|
||||||
class PrimMST {
|
public class PrimMST {
|
||||||
|
|
||||||
// Number of vertices in the graph
|
// Number of vertices in the graph
|
||||||
|
|
||||||
private static final int V = 5;
|
private static final int V = 5;
|
||||||
|
|
||||||
// A utility function to find the vertex with minimum key
|
// A utility function to find the vertex with the minimum key
|
||||||
// value, from the set of vertices not yet included in MST
|
// value, from the set of vertices not yet included in the MST
|
||||||
int minKey(int[] key, Boolean[] mstSet) {
|
int minKey(int[] key, Boolean[] mstSet) {
|
||||||
// Initialize min value
|
|
||||||
int min = Integer.MAX_VALUE;
|
int min = Integer.MAX_VALUE;
|
||||||
int minIndex = -1;
|
int minIndex = -1;
|
||||||
|
|
||||||
@ -27,54 +25,30 @@ class PrimMST {
|
|||||||
return minIndex;
|
return minIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
// A utility function to print the constructed MST stored in
|
// Function to construct MST for a graph using adjacency matrix representation
|
||||||
// parent[]
|
public int[] primMST(int[][] graph) {
|
||||||
void printMST(int[] parent, int n, int[][] graph) {
|
int[] parent = new int[V]; // Array to store constructed MST
|
||||||
System.out.println("Edge Weight");
|
int[] key = new int[V]; // Key values to pick minimum weight edge
|
||||||
for (int i = 1; i < V; i++) {
|
Boolean[] mstSet = new Boolean[V]; // Vertices not yet included in MST
|
||||||
System.out.println(parent[i] + " - " + i + " " + graph[i][parent[i]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Function to construct and print MST for a graph represented
|
// Initialize all keys as INFINITE and mstSet[] as false
|
||||||
// using adjacency matrix representation
|
|
||||||
void primMST(int[][] graph) {
|
|
||||||
// Array to store constructed MST
|
|
||||||
int[] parent = new int[V];
|
|
||||||
|
|
||||||
// Key values used to pick minimum weight edge in cut
|
|
||||||
int[] key = new int[V];
|
|
||||||
|
|
||||||
// To represent set of vertices not yet included in MST
|
|
||||||
Boolean[] mstSet = new Boolean[V];
|
|
||||||
|
|
||||||
// Initialize all keys as INFINITE
|
|
||||||
for (int i = 0; i < V; i++) {
|
for (int i = 0; i < V; i++) {
|
||||||
key[i] = Integer.MAX_VALUE;
|
key[i] = Integer.MAX_VALUE;
|
||||||
mstSet[i] = Boolean.FALSE;
|
mstSet[i] = Boolean.FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always include first 1st vertex in MST.
|
// Always include the first vertex in MST
|
||||||
key[0] = 0; // Make key 0 so that this vertex is
|
key[0] = 0; // Make key 0 to pick the first vertex
|
||||||
// picked as first vertex
|
|
||||||
parent[0] = -1; // First node is always root of MST
|
parent[0] = -1; // First node is always root of MST
|
||||||
|
|
||||||
// The MST will have V vertices
|
// The MST will have V vertices
|
||||||
for (int count = 0; count < V - 1; count++) {
|
for (int count = 0; count < V - 1; count++) {
|
||||||
// Pick thd minimum key vertex from the set of vertices
|
// Pick the minimum key vertex not yet included in MST
|
||||||
// not yet included in MST
|
|
||||||
int u = minKey(key, mstSet);
|
int u = minKey(key, mstSet);
|
||||||
|
|
||||||
// Add the picked vertex to the MST Set
|
|
||||||
mstSet[u] = Boolean.TRUE;
|
mstSet[u] = Boolean.TRUE;
|
||||||
|
|
||||||
// Update key value and parent index of the adjacent
|
// Update key value and parent index of adjacent vertices of the picked vertex
|
||||||
// vertices of the picked vertex. Consider only those
|
for (int v = 0; v < V; v++) {
|
||||||
// vertices which are not yet included in MST
|
|
||||||
for (int v = 0; v < V; v++) // Update the key only if graph[u][v] is smaller than key[v] // mstSet[v] is
|
|
||||||
// false for vertices not yet included in MST // graph[u][v] is non zero only
|
|
||||||
// for adjacent vertices of m
|
|
||||||
{
|
|
||||||
if (graph[u][v] != 0 && !mstSet[v] && graph[u][v] < key[v]) {
|
if (graph[u][v] != 0 && !mstSet[v] && graph[u][v] < key[v]) {
|
||||||
parent[v] = u;
|
parent[v] = u;
|
||||||
key[v] = graph[u][v];
|
key[v] = graph[u][v];
|
||||||
@ -82,29 +56,6 @@ class PrimMST {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// print the constructed MST
|
return parent; // Return the MST parent array
|
||||||
printMST(parent, V, graph);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
/* Let us create the following graph
|
|
||||||
2 3
|
|
||||||
(0)--(1)--(2)
|
|
||||||
| / \ |
|
|
||||||
6| 8/ \5 |7
|
|
||||||
| / \ |
|
|
||||||
(3)-------(4)
|
|
||||||
9 */
|
|
||||||
PrimMST t = new PrimMST();
|
|
||||||
int[][] graph = new int[][] {
|
|
||||||
{0, 2, 0, 6, 0},
|
|
||||||
{2, 0, 3, 8, 5},
|
|
||||||
{0, 3, 0, 0, 7},
|
|
||||||
{6, 8, 0, 0, 9},
|
|
||||||
{0, 5, 7, 9, 0},
|
|
||||||
};
|
|
||||||
|
|
||||||
// Print the solution
|
|
||||||
t.primMST(graph);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.thealgorithms.datastructures.graphs;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class PrimMSTTest {
|
||||||
|
|
||||||
|
private final PrimMST primMST = new PrimMST();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSimpleGraph() {
|
||||||
|
// Test graph with 5 nodes and weighted edges
|
||||||
|
int[][] graph = {{0, 2, 0, 6, 0}, {2, 0, 3, 8, 5}, {0, 3, 0, 0, 7}, {6, 8, 0, 0, 9}, {0, 5, 7, 9, 0}};
|
||||||
|
|
||||||
|
int[] expectedParent = {-1, 0, 1, 0, 1};
|
||||||
|
int[] actualParent = primMST.primMST(graph);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedParent, actualParent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDisconnectedGraph() {
|
||||||
|
// Test case with a disconnected graph (no valid MST)
|
||||||
|
int[][] graph = {{0, 1, 0, 0, 0}, {1, 0, 2, 0, 0}, {0, 2, 0, 3, 0}, {0, 0, 3, 0, 4}, {0, 0, 0, 4, 0}};
|
||||||
|
|
||||||
|
int[] expectedParent = {-1, 0, 1, 2, 3}; // Expected MST parent array
|
||||||
|
int[] actualParent = primMST.primMST(graph);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedParent, actualParent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAllEqualWeightsGraph() {
|
||||||
|
// Test case where all edges have equal weight
|
||||||
|
int[][] graph = {{0, 1, 1, 1, 1}, {1, 0, 1, 1, 1}, {1, 1, 0, 1, 1}, {1, 1, 1, 0, 1}, {1, 1, 1, 1, 0}};
|
||||||
|
|
||||||
|
int[] expectedParent = {-1, 0, 0, 0, 0}; // Expected MST parent array (any valid spanning tree)
|
||||||
|
int[] actualParent = primMST.primMST(graph);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedParent, actualParent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSparseGraph() {
|
||||||
|
// Test case with a sparse graph (few edges)
|
||||||
|
int[][] graph = {{0, 1, 0, 0, 0}, {1, 0, 1, 0, 0}, {0, 1, 0, 1, 0}, {0, 0, 1, 0, 1}, {0, 0, 0, 1, 0}};
|
||||||
|
|
||||||
|
int[] expectedParent = {-1, 0, 1, 2, 3}; // Expected MST parent array
|
||||||
|
int[] actualParent = primMST.primMST(graph);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedParent, actualParent);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user