mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-06 09:06:51 +08:00
Add tests, fix removeEdge
bug in MatrixGraphs
(#5968)
This commit is contained in:
@ -851,6 +851,7 @@
|
||||
* [KahnsAlgorithmTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/KahnsAlgorithmTest.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)
|
||||
* [MatrixGraphsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/graphs/MatrixGraphsTest.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)
|
||||
* hashmap
|
||||
|
@ -102,7 +102,7 @@ class AdjacencyMatrixGraph {
|
||||
/**
|
||||
* Updates the number of edges in the graph
|
||||
*
|
||||
* @param newNumberOfEdges
|
||||
* @param newNumberOfEdges the new number of edges
|
||||
*
|
||||
*/
|
||||
private void setNumberOfEdges(int newNumberOfEdges) {
|
||||
@ -202,7 +202,7 @@ class AdjacencyMatrixGraph {
|
||||
* exists and is removed
|
||||
*/
|
||||
public boolean removeEdge(int from, int to) {
|
||||
if (!this.vertexDoesExist(from) || !this.vertexDoesExist(to)) {
|
||||
if (this.vertexDoesExist(from) && this.vertexDoesExist(to)) {
|
||||
if (this.adjacencyOfEdgeDoesExist(from, to)) {
|
||||
this.adjacency()[from][to] = AdjacencyMatrixGraph.EDGE_NONE;
|
||||
this.adjacency()[to][from] = AdjacencyMatrixGraph.EDGE_NONE;
|
||||
@ -223,14 +223,14 @@ class AdjacencyMatrixGraph {
|
||||
public List<Integer> depthFirstOrder(int startVertex) {
|
||||
// If the startVertex is invalid, return an empty list
|
||||
if (startVertex >= vertexCount || startVertex < 0) {
|
||||
return new ArrayList<Integer>();
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
// Create an array to track the visited vertices
|
||||
boolean[] visited = new boolean[vertexCount];
|
||||
|
||||
// Create a list to keep track of the order of our traversal
|
||||
ArrayList<Integer> orderList = new ArrayList<Integer>();
|
||||
ArrayList<Integer> orderList = new ArrayList<>();
|
||||
|
||||
// Perform our DFS algorithm
|
||||
depthFirstOrder(startVertex, visited, orderList);
|
||||
@ -278,18 +278,18 @@ class AdjacencyMatrixGraph {
|
||||
public List<Integer> breadthFirstOrder(int startVertex) {
|
||||
// If the specified startVertex is invalid, return an empty list
|
||||
if (startVertex >= vertexCount || startVertex < 0) {
|
||||
return new ArrayList<Integer>();
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
// Create an array to keep track of the visited vertices
|
||||
boolean[] visited = new boolean[vertexCount];
|
||||
|
||||
// Create a list to keep track of the ordered vertices
|
||||
ArrayList<Integer> orderList = new ArrayList<Integer>();
|
||||
ArrayList<Integer> orderList = new ArrayList<>();
|
||||
|
||||
// Create a queue for our BFS algorithm and add the startVertex
|
||||
// to the queue
|
||||
Queue<Integer> queue = new LinkedList<Integer>();
|
||||
Queue<Integer> queue = new LinkedList<>();
|
||||
queue.add(startVertex);
|
||||
|
||||
// Continue until the queue is empty
|
||||
@ -327,19 +327,19 @@ class AdjacencyMatrixGraph {
|
||||
* @return returns a string describing this graph
|
||||
*/
|
||||
public String toString() {
|
||||
String s = " ";
|
||||
StringBuilder s = new StringBuilder(" ");
|
||||
for (int i = 0; i < this.numberOfVertices(); i++) {
|
||||
s = s + i + " ";
|
||||
s.append(i).append(" ");
|
||||
}
|
||||
s = s + " \n";
|
||||
s.append(" \n");
|
||||
|
||||
for (int i = 0; i < this.numberOfVertices(); i++) {
|
||||
s = s + i + " : ";
|
||||
s.append(i).append(" : ");
|
||||
for (int j = 0; j < this.numberOfVertices(); j++) {
|
||||
s = s + this.adjMatrix[i][j] + " ";
|
||||
s.append(this.adjMatrix[i][j]).append(" ");
|
||||
}
|
||||
s = s + "\n";
|
||||
s.append("\n");
|
||||
}
|
||||
return s;
|
||||
return s.toString();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,140 @@
|
||||
package com.thealgorithms.datastructures.graphs;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class MatrixGraphsTest {
|
||||
|
||||
@Test
|
||||
void testGraphConstruction() {
|
||||
AdjacencyMatrixGraph graph = new AdjacencyMatrixGraph(5);
|
||||
assertEquals(5, graph.numberOfVertices());
|
||||
assertEquals(0, graph.numberOfEdges());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddEdge() {
|
||||
AdjacencyMatrixGraph graph = new AdjacencyMatrixGraph(5);
|
||||
assertTrue(graph.addEdge(0, 1));
|
||||
assertTrue(graph.edgeDoesExist(0, 1));
|
||||
assertTrue(graph.edgeDoesExist(1, 0));
|
||||
assertEquals(1, graph.numberOfEdges());
|
||||
|
||||
// Adding the same edge again should return false
|
||||
assertFalse(graph.addEdge(0, 1));
|
||||
assertFalse(graph.addEdge(5, 1));
|
||||
assertFalse(graph.addEdge(-1, 1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRemoveEdge() {
|
||||
AdjacencyMatrixGraph graph = new AdjacencyMatrixGraph(5);
|
||||
graph.addEdge(0, 1);
|
||||
graph.addEdge(1, 2);
|
||||
|
||||
assertTrue(graph.removeEdge(0, 1));
|
||||
assertFalse(graph.edgeDoesExist(0, 1));
|
||||
assertFalse(graph.edgeDoesExist(1, 0));
|
||||
assertEquals(1, graph.numberOfEdges());
|
||||
|
||||
assertFalse(graph.removeEdge(0, 3));
|
||||
assertFalse(graph.removeEdge(5, 1));
|
||||
assertFalse(graph.removeEdge(-1, 1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testVertexDoesExist() {
|
||||
AdjacencyMatrixGraph graph = new AdjacencyMatrixGraph(5);
|
||||
assertTrue(graph.vertexDoesExist(0));
|
||||
assertTrue(graph.vertexDoesExist(4));
|
||||
assertFalse(graph.vertexDoesExist(5));
|
||||
assertFalse(graph.vertexDoesExist(-1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDepthFirstOrder() {
|
||||
AdjacencyMatrixGraph graph = new AdjacencyMatrixGraph(5);
|
||||
graph.addEdge(0, 1);
|
||||
graph.addEdge(0, 2);
|
||||
graph.addEdge(1, 3);
|
||||
graph.addEdge(2, 4);
|
||||
|
||||
List<Integer> dfs = graph.depthFirstOrder(0);
|
||||
assertEquals(5, dfs.size());
|
||||
assertEquals(0, dfs.getFirst());
|
||||
|
||||
assertTrue(dfs.containsAll(Arrays.asList(0, 1, 2, 3, 4)));
|
||||
|
||||
List<Integer> emptyDfs = graph.depthFirstOrder(5);
|
||||
assertTrue(emptyDfs.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testBreadthFirstOrder() {
|
||||
AdjacencyMatrixGraph graph = new AdjacencyMatrixGraph(5);
|
||||
graph.addEdge(0, 1);
|
||||
graph.addEdge(0, 2);
|
||||
graph.addEdge(1, 3);
|
||||
graph.addEdge(2, 4);
|
||||
|
||||
List<Integer> bfs = graph.breadthFirstOrder(0);
|
||||
assertEquals(5, bfs.size());
|
||||
assertEquals(0, bfs.getFirst());
|
||||
|
||||
assertTrue(bfs.containsAll(Arrays.asList(0, 1, 2, 3, 4)));
|
||||
|
||||
List<Integer> emptyBfs = graph.breadthFirstOrder(5);
|
||||
assertTrue(emptyBfs.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testToString() {
|
||||
AdjacencyMatrixGraph graph = new AdjacencyMatrixGraph(3);
|
||||
graph.addEdge(0, 1);
|
||||
graph.addEdge(1, 2);
|
||||
|
||||
String expected = " 0 1 2 \n"
|
||||
+ "0 : 0 1 0 \n"
|
||||
+ "1 : 1 0 1 \n"
|
||||
+ "2 : 0 1 0 \n";
|
||||
|
||||
assertEquals(expected, graph.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testCyclicGraph() {
|
||||
AdjacencyMatrixGraph graph = new AdjacencyMatrixGraph(4);
|
||||
graph.addEdge(0, 1);
|
||||
graph.addEdge(1, 2);
|
||||
graph.addEdge(2, 3);
|
||||
graph.addEdge(3, 0);
|
||||
|
||||
List<Integer> dfs = graph.depthFirstOrder(0);
|
||||
List<Integer> bfs = graph.breadthFirstOrder(0);
|
||||
|
||||
assertEquals(4, dfs.size());
|
||||
assertEquals(4, bfs.size());
|
||||
assertTrue(dfs.containsAll(Arrays.asList(0, 1, 2, 3)));
|
||||
assertTrue(bfs.containsAll(Arrays.asList(0, 1, 2, 3)));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDisconnectedGraph() {
|
||||
AdjacencyMatrixGraph graph = new AdjacencyMatrixGraph(5);
|
||||
graph.addEdge(0, 1);
|
||||
graph.addEdge(2, 3);
|
||||
|
||||
List<Integer> dfs = graph.depthFirstOrder(0);
|
||||
List<Integer> bfs = graph.breadthFirstOrder(0);
|
||||
|
||||
assertEquals(2, dfs.size());
|
||||
assertEquals(2, bfs.size());
|
||||
assertTrue(dfs.containsAll(Arrays.asList(0, 1)));
|
||||
assertTrue(bfs.containsAll(Arrays.asList(0, 1)));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user